近些年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的通訊。