使用Tcp的Socket通信.
服务器端:
Socket server = ......... (tcp的)
 IPEndPoint serverPoint = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 8888); //获得本地终结点
server.Bind(serverPoint); //绑定
server.Listen(100); //监听
Socket s1 = server.Accept();
int len = s1.Receive(buffer);  //接收数据客户端:
Socket client = ....... (tcp的)
client.Connect(IPAddress.Parse("192.168.1.5"),8888); //本机地址是192.168.1.5本来如果客户端没有发送数据的话,服务器会一直停在s1.Receive上.
但是我如果在客户端同时用两个client去连接,服务器端接收这两个连接:服务器端:(以下代码可以直接运行)
   Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint serverPoint = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], 8888); //本地终结点
            server.Bind(serverPoint); //绑定
            server.Listen(100);            Socket s = server.Accept();
            Console.WriteLine("s is Accept");
            Socket s2 = server.Accept();
            Console.WriteLine("s2 is Accept");
            
            byte[] buffer = new byte[5];
            
            int len =  s.Receive(buffer);
            Console.WriteLine("s第一次收到数据长度是:{0}", len);            len = s.Receive(buffer);
            Console.WriteLine("s第二次收到数据长度是:{0}", len);            len =  s2.Receive(buffer);
            Console.WriteLine("s2第一次收到数据长度是:{0}",len);            len = s.Receive(buffer);
            Console.WriteLine("s2第二次收到数据长度是:{0}", len);
   
客户端:(代码可直接运行)
              Socket client = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
              client.Connect(IPAddress.Parse("192.168.1.5"),8888);
               Socket client2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
               client2.Connect(IPAddress.Parse("192.168.1.5"), 8888);
这个时候 连接成功之后 再在服务器端调用 s和s2的Revice函数,就不会阻塞,而且可以调用无数次,并且每次接收到的数据长度都是0 请哪个高手讲解下为什么会这样啊?

解决方案 »

  1.   

    我这里没有这样的现象,Receive会阻塞线程!看看是不是其它的问题导致的!
    我的环境是:windows 2003+VS2005!
      

  2.   

    原来是在客户端调用了Socket的Close函数就会出现我说的情况 请问是怎么回事啊?
      

  3.   

    客户端Close之后当然会这样,你在接收到一个0字节的数据之后应该马上Close掉这个Socket!
      

  4.   

    多个client连接请使用多线程 或 异步
      

  5.   

    随便问下,为什么运行到 Socket s1 = server.Accept(); 时程序就不动了呢
      

  6.   

    s.Receive 应该是会阻塞住直到有数据返回,除非你用Socket.ReceiveTimeout 设置了等待时间,而这时候也会有SocketException 发生.还有LZ说收到的数据长度都是0,这很象Socekt 连接由于某种原因已经断开.