flex與c#基於socket的即時互動網路遊戲編程教程一

來源:互聯網
上載者:User

近些年webGame非常火爆,可惜相關教程實在少之又少,在我學習過程中無數次baidu,google。發現實際涉及wenGame核心的東西基本沒有。於是就有了把我學習過程中使用和總結的代碼拿上來給大家分享,讓有共同愛好的同學們少走彎路。

本教程基於flex與c#,做到完全同步的遊戲設計與編寫。本教程只提供實現準系統的代碼,只要融會貫通,就能在此基礎上製作出無比強大的網路遊戲。

這篇教程最好是對c#有一定基礎,會使用vs的同學。如果不會,我推薦看一下《c#網路應用編程》。

本教如需轉載,請注名作者——汪艦,連絡方式sxnrt#126.com。

先來段c#下基由socket串連的代碼,什麼不是講flex?flex串連伺服器端也是用c#寫的(其實也可以用c++或者java寫,不過原理都是一樣,一通百通)

說明,c#封裝了socket,提供操作更方便的Tcpclient與TcpListener,c#屬於

伺服器端

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net;

using System.Net.Sockets;

using System.Threading;

using System.IO;

 

namespace TestOnlyServer

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        /// <summary>使用的本機IP地址</summary>

        IPAddress localAddress;

        /// <summary>監聽連接埠</summary>

        private const int port = 51888;

        private TcpListener myListener;

 

        public BinaryReader br;//讀取串連使用者發來的資料

        private BinaryWriter bw;//給串連使用者發送資料

 

        private void Form1_Load(object sender, EventArgs e)

        {

          //  IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());

          //  localAddress = addrIP[0];

 

            localAddress = IPAddress.Parse("192.168.1.100");//換成本機ip

        }

 

        private void button1_Click(object sender, EventArgs e)

        {//在設計面版加一個按鈕並添加一個事件

            myListener = new TcpListener(localAddress, port); //檢聽連接埠設定

            myListener.Start();//開始檢聽連接埠

            textBox1.Text = string.Format("開始在{0}:{1}監聽客戶串連", localAddress, port);

            //建立一個線程監聽用戶端串連請求

            Thread myThread = new Thread(ListenClientConnect);

            myThread.Start();//開始線程,其實線程的概念很好理解,就是執行一個函數,不過這個函數只和其他函數是並發的,並且佔用的伺服器資源比較小,因為只用了一部分計算資源

        }

 

        /// <summary>接收用戶端串連</summary>

        ///

 

 

 

        private void ListenClientConnect()

        {

 

            TcpClient newClient = null;

            while (true)

            {

                try

                {

                    newClient = myListener.AcceptTcpClient();//當有客戶串連時執行一次下面的步驟

                }

                catch

                {

                    //當單擊“停止監聽”或者退出此表單時AcceptTcpClient()會產生異常

                    //因此可以利用此異常退出迴圈

                    break;

                }

                //每接受一個用戶端串連,就建立一個對應的線程迴圈接收該用戶端發來的資訊

                Thread threadReceive = new Thread(ReceiveData);

                threadReceive.Start(newClient);

 

 

                textShow(string.Format("[{0}]進入", newClient.Client.RemoteEndPoint));

//因為textBox1不是由本線程建立的,所以要線上程中操作textBox1必須使用一個動態引用

 

 

            }

 

        }

 

        //現成援引From控制項

        delegate void SetTextCallback(string text);

        private void textShow(string str)

        {

            if (textBox1.InvokeRequired)

            {

                SetTextCallback d = textShow;

                textBox1.Invoke(d,str);

            }

 

            else

            {

                this.textBox1.Text = "/n" + textBox1.Text + str;

            }

 

 

        }

 

 

 

        /// <summary>

        /// 處理接收的用戶端資料

        /// </summary>

        /// <param name="userState">用戶端資訊</param>

        private void ReceiveData(object userState)

        {

            TcpClient client = (TcpClient)userState;

            NetworkStream networkStream = client.GetStream();

            //將網路流作為二進位讀寫對象

            br = new BinaryReader(networkStream);

            bw = new BinaryWriter(networkStream);

            while (true)

            {

                string receiveString = null;

                try

                {

                    //從網路流中讀出字串,此方法會自動判斷字串長度首碼,並根據長度首碼讀出字串

 

                    textShow(string.Format("測試資料1"));

 

                    receiveString = br.ReadString();

                    textShow(string.Format("測試資料2"));

                }

                catch

                {

 

                    break;

                }

 

                textShow(string.Format("[{0}]哈哈哈", receiveString));

 

                //猜測,如果想給所有客用端發資訊,在開始時應該把客用端儲存在一個array裡,然後這裡用迴圈發送

                bw.Write("oyoy");

                bw.Flush();

 

            }

        }

 

    }

}

 

客用端

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.IO;

using System.Net;

using System.Threading;

 

namespace TestOnlyClient

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

 

        private TcpClient client;

        private BinaryReader br;

        private BinaryWriter bw;

 

        private void Form1_Load(object sender, EventArgs e)

        {

 

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            client = new TcpClient(Dns.GetHostName(), 51888);

            textBox1.Text = "串連咯";

 

 

            Thread threadReceive = new Thread(new ThreadStart(ReceiveData));

            threadReceive.Start();

        }

        private void button2_Click(object sender, EventArgs e)

        {

            try

            {

                NetworkStream networkStream = client.GetStream();

                bw = new BinaryWriter(networkStream);

                bw.Write("gogogo");

                bw.Flush();

            }

            catch

            {

               

            }

        }

 

        private void ReceiveData()

        {

            NetworkStream networkStream = client.GetStream();

            //將網路流作為二進位讀寫對象

            br = new BinaryReader(networkStream);

            string receiveString = null;

            receiveString = br.ReadString();

            MessageBox.Show(receiveString);

        }

 

    }

}

 

Ok,用vs分別開啟2個工程,把ip換成自己原生ip,你要不知道怎麼看本機ip,那我也沒啥好說的,呵呵。

這樣就建立了純c#的程式通訊。下一節開始講如何使用flex與c#做最基本的基於socket的通訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.