嘛嘛~难得的假期耶。于是乎狠狠的玩了一番。 连续3天,每天5个小时的dota. 都玩的头痛了耶。
于是乎,今天下午的时候,终于玩吐了。 觉得这一个月都不想碰dota的说。
话说~很久很久以前,就想研究下socket套字节的服务端与客户端的实现。
研究了6个小时,感觉的有点入门的説。不过还有点小问题要解决。
一开始的服务器端的代码为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //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连接
代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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 。 我不知道原理是啥。。。
嘛~等这周末,再花一天来好好研究下吧。