try 下 看下什么异常···

解决方案 »

  1.   

    症状:
    1. 客户端收到了欢迎消息。说明客户端连接成功了·····2.服务器端没有收到客户端发送的消息!客户端没有把数据发送过去。什么原因,卡死?堵塞?还是其他···try下···
    3.客户端死掉了!
    未捕获异常,直接导致程序奔溃··
      

  2.   

    为何不使用 TcpClient 进行连接操作。
    和使用NetworkStream进行数据的发送
      

  3.   


    try 没用,一直没有进入catch里面,对.net的socket不熟。
    感觉有点像,数据仍然在buffer里面没发送,所以receive一直在等待。
      

  4.   

    那用 TcpClient 试下了···
      

  5.   

    你这不是卡死在那里。而是停在那里待待来自服务器的信息,这时你应该检查你的服务端。这是MSDN上的:如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用 Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发 SocketExceptionhttp://msdn.microsoft.com/zh-cn/library/8s4y8aff(v=vs.80).aspx
      

  6.   

    谢谢提醒!~服务器端简单处理,对于非指定的指令,则立即回发消息 "unkown comand xxx",如上图所示。
      

  7.   

    那用 TcpClient 试下了···改成TcpClient一样的问题呢,不知道代码对不对,如下:
            public static string getData(string type)
            {
                TcpClient client = new TcpClient("localhost", 8081);
                 client.SendTimeout = 5000;
                NetworkStream stream = client.GetStream();
                try
                {
                    String responseData = String.Empty;
                    string welcom_msg = "Welcome to rss server\r\n==============================";
                    Byte[] data = new Byte[welcom_msg.Length+2];//for "type" argument message
                    Int32 bytes = stream.Read(data, 0, data.Length);
                    
                    data = System.Text.Encoding.ASCII.GetBytes(type);//for "type" argument message
                    stream.Write(data, 0, data.Length);
                    data = new Byte[1024];
                    bytes = stream.Read(data, 0, 10);
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);                return responseData;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                finally
                {
                    stream.Close();
                    client.Close();
                }
            }同样:
    1. 能够收到欢迎消息
    2. 似乎发送不出去,服务器没有收到消息
    3. 客户端一直塞在了receive那里,没有异常。直接无视了timeout
      

  8.   

            public static string getData(string type)
            {
                byte[] data = new byte[1024];
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Connect("localhost", 8081);          
                s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
     
                s.SendTimeout = 5000;
                int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>"));
                //s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081));
                s.Receive(data);//debug执行到这里就死掉了
                s.Shutdown(SocketShutdown.Both);
                s.Close();
                return Encoding.UTF8.GetString(data);
            }
      

  9.   

            public static string getData(string type)
            {
                byte[] data = new byte[1024];
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Connect("localhost", 8081);          
                s.Receive(data); //这里去掉 或者在服务器端连上后直接发送个数据给客户端。receive是会阻塞当前线程的。
     
                s.SendTimeout = 5000;
                int n= s.Send(Encoding.ASCII.GetBytes(type+"<EOF>"));
                //s.SendTo(Encoding.ASCII.GetBytes(type), new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8081));
                s.Receive(data);//debug执行到这里就死掉了
                s.Shutdown(SocketShutdown.Both);
                s.Close();
                return Encoding.UTF8.GetString(data);
            }
      

  10.   


    谢谢您的回答。
    不好意思,我没说清楚,阻塞的是第二个receive。
    第一个receive不会阻塞,因为socket连上时服务器会给客户端主动发送消息。(欢迎消息)================================================
    感谢楼上各位的回答,该问题已经解决,问题的根源在于send没有很好的用结束符标记。在windows下面结束符应该是"\r\n"。
    也即是说 client_sock.send(msg+"\r\n"), socket消息才算发出去!
    否则就是放到待发送缓冲区而已。
    而这个时候又去receive,所以死掉了。