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

嘛嘛~难得的假期耶。于是乎狠狠的玩了一番。 连续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 。 我不知道原理是啥。。。

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

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.