Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.1.234"), 11100);
     sock.Connect(ipe);
     string s = "欢迎光临";
     byte[] msg = Encoding.UTF8.GetBytes(s);
     sock.Send(msg);
     我想做一个Tcp长连接,所以发送消息后,没有把sock关闭,第一次发送时服务器能接收到,但是,我在下面的继续调用sock.Send(msg);服务器却没有收到消息,请问这是怎么回事?服务器要怎样才能正常的接受数据?服务器端接收的代码如下:
           string data = "";
           byte[] bytes = new Byte[1024];
           IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
           IPAddress ipAddress = ipHostInfo.AddressList[0];
           IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11100);
           Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           try
           {
               listener.Bind(localEndPoint);
               listener.Listen(10);
               while (true)
               {
                   Socket handler = listener.Accept();
                   bytes = new byte[1024];
                   int bytesRec = handler.Receive(bytes);
                   data = Encoding.UTF8.GetString(bytes, 0, bytesRec);
               }
             .......

解决方案 »

  1.   

    Socket handler = listener.Accept(); 
    只有再有新的连接进入时,才会向下进行.你调试下就知道了.
    或者你在加个线程专门
    recieveData
    建议有异步的socket来做,比较通用,
      

  2.   

    我刚才看了下异步读取数据的代码,发现读取数据的socket需要连接到客户端才能开始异步读取.
    那这样不是先要监听客户端发来的连接请求,再用异步socket去监听这个客户端发送来的数据?也就是说每连接一个客户端就要新建一个socket异步读取它发送的数据,是这样的吗?
      

  3.   

    http://blog.csdn.net/nick4/archive/2008/06/28/2594158.aspx
      

  4.   

    服务器端用线程处理,如下:
             Socket _Socket = null;
            Thread _Thread;        private void BeginListen()
            {
                   、、、、、、相关接受处理
            }
            // 清理所有正在使用的资源.         protected override void Dispose(bool disposing)
            {            try
                {              _Socket.Close();//释放资源 
                    _Thread.Abort();//中止线程             }            catch { }
                if (disposing)
                {
                    if (components != null)
                    {                    components.Dispose();                }            }            base.Dispose(disposing);        } //启动监听
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    _Thread = new Thread(new ThreadStart(BeginListen));
                    _Thread.Start();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
      

  5.   

    可扩展多线程异步Socket服务器框架EMTASS 2.0
      

  6.   

    我在服务器端用了异步读取数据的代码(参看了上面连接的内容写的),然而问题依然没有解决,客户端使用同一个socket发送信息,第一次可以,但第二次还是没能接收到,为什么啊?如果每次重新new 一个socket来发送就正常了.
      

  7.   

    Socket handler = listener.Accept();
    只有再有新的连接进入时,才会向下进行
    .你调试下就知道了.
    或者你在加个线程专门
    recieveData
    建议有异步的socket来做,比较通用,---------
    都回答了,难道是没看到么?
      

  8.   

    这个我知道了,谢谢,但上面我说的是用异步接收数据,代码如下:
     string data = "";
               byte[] bytes = new Byte[1024];
               IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
               IPAddress ipAddress = ipHostInfo.AddressList[0];
               IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11100);
               Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
               try
               {
                   listener.Bind(localEndPoint);
                   listener.Listen(10);
                   while (true)
                   {
                       allDone.Reset();
                       listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                       allDone.WaitOne();
                   }
                 }
    剩下的就不贴了 太长了
      

  9.   

    handler.Receive(bytes); 
    改成handler.BeginReceive(...);
      

  10.   

    谢谢楼上各位,特别是:bbbbbb888888 和qinhl99 ,用异步接收已经搞定了