socket学习 同步

来源:互联网 发布:怎么在淘宝上写评价 编辑:程序博客网 时间:2024/06/05 20:00

socket分为2种模式,同步和异步,

同步:

服务器端

建立联接,首先声明一个全局的Socket,这个必须是全局的,因为其他的地方还需要使用这个实例。

Socket socket;

建立监听

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.200.212"), 1234);

            socket.Bind(ipEndPoint);

            socket.Listen(10);

这样就建立了允许最多10个用户的监听,

 

然后建立线程监听获得的消息

 Thread t = new Thread(StartListener);

            t.IsBackground = true;

            t.Start();

这个线程是为了接收多个客户端联接。

 

以上代码可以放到Page_load里,或者放到服务器的启动按钮里。

  private void StartListener()
        {
            while (true)
            {
                byte[] packBuff = new byte[maxSize];

                Socket newClient =socket.Accept();

                newClient.Receive(packBuff);

                string ip = Encoding.UTF8.GetString(packBuff).TrimEnd('/0');

                ht.Add(ip, newClient);//这里是把联接的客户端更新下,不影响核心逻辑

                UpdateOnlineUserList(ip, true);//这里是把联接的客户端更新下,不影响核心逻辑

                System.Threading.Thread t = new System.Threading.Thread(new ParameterizedThreadStart(ReceivedMsg));

                t.IsBackground = true;
                t.Start(ip);
            }
           
        }

在监听线程里把链接的客户端保存起来,同时建立一个线程来启动接收数据

 private void ReceivedMsg(object userName)
        {
            while (true)
            {
                Socket clientSocket = ht[userName] as Socket;

                byte[] buff = new byte[128];

                clientSocket.Receive(buff);

                string message = Encoding.UTF8.GetString(buff).TrimEnd('/0');

                if (message == "")
                {
                    continue;
                }
                string flag = message.Substring(0, 2);
                this.Invoke((EventHandler)delegate
                {
                    lstReceiveMsg.Items.Add(message + "_"+flag+"_" + userName);

                });

                switch (flag)
                {
                    case"01":
                        ht.Remove(userName);
                        UpdateOnlineUserList(userName.ToString(),false);
                        Thread.CurrentThread.Abort();
                        break;
                   
                    default:
                      
                        string ip = message.Split('#')[0];

                        if (ht.ContainsKey(ip))
                        {
                            this.Invoke((EventHandler)delegate
                            {
                                lstReceiveMsg.Items.Add("Send " + ip + " Say:" + message.Split('#')[1]);

                            });
                            Socket talkSocke = ht[ip] as Socket;

                            talkSocke.Send(Encoding.UTF8.GetBytes(userName.ToString()+" Say:"+message.Split('#')[1]));

                        }
                        break;
                }
            }
        }

这里接收到数据,同时进行处理,

 

客户端:

 

建立联接,首先声明一个全局的Socket,这个必须是全局的,因为其他的地方还需要使用这个实例。

Socket socket;

建立连接

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.200.212"), 1234);

              socket.Connect(ipEndPoint);

 

新建线程来获取接收数据

            Thead  t = new Thread(ReceivedMsg);

            t.IsBackground = true;

            t.Start();

以上代码可以放到Page_load或者联接按钮里。

 


        private void ReceivedMsg()
        {
            while (true)
            {
                byte[] b = new byte[1024*60];

                socket.Receive(b);

                string message = Encoding.UTF8.GetString(b).TrimEnd('/0');
               }

         }

这里是解决接收数据的线程。

 

原创粉丝点击