我用异步SOCKET写了一个程序,可在服务器在同一时间只能与一个客户端连接,望高手指点,让与其多个客户端进行通信,多线程我看的是一头雾水,在线等。

解决方案 »

  1.   

    这里是代码:            
    try
                {
                    IPHostEntry myHost = new IPHostEntry();
                    myHost = Dns.GetHostByName(this.textBoxName.Text);
                    myIP = IPAddress.Parse(myHost.AddressList[nettype].ToString());
                    iep = new IPEndPoint(myIP, Int32.Parse(this.textBoxPort.Text));
                }
                catch
                {
                    MessageBox.Show("你输入的服务器名或端口号格式不正确,请重新输入!");
                    return;
                }
                this.listBoxState.Items.Add("开始监听...");
                this.buttonStart.Enabled = false;
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                serverSocket.Bind(iep);
                serverSocket.Listen(10);
                serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
                //thread = new Thread(new ThreadStart(Begin));
                //thread.Start();
            }
            //private void Begin()
            //{
            //    while (true)
            //    {
            //        serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
            //    }
            //}
            private void AcceptConnection(IAsyncResult ar)
            {
                try
                {
                    Socket oldServer = (Socket)ar.AsyncState;
                    //异步接收传入的连接,并创建新的Socket来处理远程主机通信
                    clientSocket = oldServer.EndAccept(ar);                
                    this.listBoxState.Items.Add("与客户" + clientSocket.RemoteEndPoint.ToString() + "建立连接。");
                    byte[] message = System.Text.Encoding.Unicode.GetBytes("客户你好!");
                    clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), clientSocket);
                }
                catch
                {
                    treeView1.Nodes.Add("客户下线了");
                }
            }
            private void SendData(IAsyncResult ar)
            {
                Socket client = (Socket)ar.AsyncState;
                try
                {
                    clientSocket.EndSend(ar);
                    client.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), client);
                }
                catch
                {
                    client.Close();
                    this.listBoxState.Items.Add("客户已关闭连接,等待新客户……");
                    serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
                }
            }        private void ReceiveData(IAsyncResult ar)
            {
                Socket client = (Socket)ar.AsyncState;
                try
                {
                    //结束读取并获得读取的字节数
                    int receiveDataLength = client.EndReceive(ar);
                    string str = System.Text.Encoding.Unicode.GetString(data, 0, receiveDataLength);
                    this.richTextBoxReceive.Text = str;
                    byte[] message = System.Text.Encoding.Unicode.GetBytes("服务器收到信息:" + str);
                    clientSocket.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), clientSocket);
                }
                catch
                {
                    client.Close();
                    this.listBoxState.Items.Add("客户已关闭连接,等待新客户……");
                    serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
                }
            }
      

  2.   

    本人多sokcet了解一些,希望能帮助到你!
         首先多线程技术原理一定要熟悉,懂得!线程句柄,线程句柄计数等概念,内核对象!
       .
        其次:sokcet的含义,它是介于提供给应用层调用的一套接口,这这套接口会调用底层的通讯接口的---传输层; 对于用户来说:不需要了解底层,只要知道sokcet给我们提供的接口就ok了,例如:创建socket, 侦听, 接受客户端连接,接受后,建立了通信,就可以发送和接受数据了,注意:tcp是3次握手;
       一般用多线程主要是考虑到同一个sever连接多个client ,这个时候,一般需要在服务器端维护一个接口客户端连接的列表;
       .
        socket变成模型很多种,有基本事件的,重叠i/o的;等等! 
         另外对于windows窗口,事件句柄等概念需要清楚!
    有空来我空间看看    http://hi.baidu.com/happylatch
       .
      

  3.   

    那我该怎么写,你能帮我一个吗,我用
      //thread = new Thread(new ThreadStart(Begin));
      //thread.Start();
      }
      //private void Begin()
      //{
      // while (true)
      // {
      // serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
      // }
      //}
    不行,可以写错了,你能帮我改下吗
      

  4.   

    那我该怎么写,你能帮我一个吗,我用
      //thread = new Thread(new ThreadStart(Begin));
      //thread.Start();
      }
      //private void Begin()
      //{
      // while (true)
      // {
      // serverSocket.BeginAccept(new AsyncCallback(AcceptConnection), serverSocket);
      // }
      //}
    不行,可以写错了,你能帮我改下吗
      

  5.   

    这个异步socket通信封装得很好,值得学习研究!
    一个我经常参考的异步socket通信:

      

  6.   

    C# UDP(Socket)异步传输文件http://www.csharpwin.com/csharpresource/818.shtml也可以参考一下