5-1连续玩3天DOTA,表示头很大的说。顺便C#的Socket似乎有点略懂了。

嘛嘛~难得的假期耶。于是乎狠狠的玩了一番。 连续3天,每天5个小时的dota. 都玩的头痛了耶。

于是乎,今天下午的时候,终于玩吐了。 觉得这一个月都不想碰dota的说。

话说~很久很久以前,就想研究下socket套字节的服务端与客户端的实现。

研究了6个小时,感觉的有点入门的説。不过还有点小问题要解决。

一开始的服务器端的代码为


//int rev;
//byteMessage = new byte[1024];
//IPEndPoint iep = new IPEndPoint(IPAddress.Any, 8000);
//socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//setLabel("服务正在运行...");
//socket.Bind(iep);
//socket.Listen(10);
//setListBox("等待客户端");
//newSocket = socket.Accept();
//clientip = (IPEndPoint)newSocket.RemoteEndPoint;
//setListBox(clientip.Address + ":" + clientip.Port + " 已连接到服务器");
//string welcome = "欢迎进入AoiCocoon的服务器";
//byteMessage = Encoding.Default.GetBytes(welcome);
//newSocket.Send(byteMessage, byteMessage.Length, SocketFlags.None);
//while (true)
//{
// try
// {
// byteMessage = new byte[100];
// rev=newSocket.Receive(byteMessage);
// if (rev == 0)
// {
// break;
// }
// else
// {
// string sTime = DateTime.Now.ToShortTimeString();
// string msg = sTime + ":";
// msg += Encoding.Default.GetString(byteMessage);
// setListBox(msg);
// newSocket.Send(byteMessage, rev, SocketFlags.None);
// }
// }
// catch (SocketException ex)
// {
// setListBox(ex.ToString());
// }
//}
//setListBox(clientip.Address + ":" + clientip.Port + " 已从服务器断开");
//newSocket.Close();

但是这样写有个bug ,就是同一时间只能连接1个客户端。
于是就考虑用数组来建立多个 clientSocket连接

代码为:

int rev;
ClientSocket[ClientNum] = socket.Accept();
string welcome = "welcome to my Server!";
byteMessage = Encoding.Default.GetBytes(welcome);
ClientSocket[ClientNum].Send(byteMessage, byteMessage.Length, SocketFlags.None);
//ClientSocket[ClientNum].BeginReceive(byteMessage, 0, byteMessage.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), ClientSocket[ClientNum]);
lock (this.listBox1)
{
this.listBox1.Items.Add(ClientSocket[ClientNum].RemoteEndPoint.ToString() + "已连接到服务器");
ClientNum++;
}

for (int i = 0; i <= ClientNum; i++) { while (true) { try { byteMessage = new byte[100]; if (ClientSocket[i]!= null) { rev = ClientSocket[i].Receive(byteMessage); if (rev == 0) { break; } else { string sTime = DateTime.Now.ToShortTimeString(); string msg = sTime + ":"; msg += Encoding.Default.GetString(byteMessage); setListBox(msg); ClientSocket[i].Send(byteMessage, rev, SocketFlags.None); } } } catch (SocketException ex) { setListBox(ex.ToString()); } } setListBox(ClientSocket[i].RemoteEndPoint.ToString() + " 已从服务器断开"); ClientSocket[i].Close();

但是,即使用数组,还是只能同时连接一个客户端。 第二个客户端会出现无响应。

网上查询资料,似乎有用 sync 的callback 。 我不知道原理是啥。。。

嘛~等这周末,再花一天来好好研究下吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注