说一下我是用JAVA做Server端,c#写的WINFORM做CLIENT端。
JAVA这边是TOMCAT做容器。
当我的tcpclient连接成功后,开始发送数据,,,,如果只发送数据,不接收server端的确认接收数据正常的信息(即一个"login_ok"的字符串)话是没有任何问题的,当在发送数据后加入接收SERVER返回的确认信息时就会出现“无法从传输连接中读取数据: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。。”。原因是当client加入接收数据时server就会一直处于等待接收信息的状态,不往下执行。下面贴出代码片段。请大大们帮忙解释下,并给些建议。server:public void handleConnection(Socket connection) {
        System.out.println("客户:" + connection.getInetAddress() + "在时间:" + Calendar.getInstance().getTime().toString() + "访问过!"); 
        try {
            PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            System.out.println("111111111111111");
            String read = streamReader.readLine();//如果客户端加入接收信息,就会停在这里不往下执行.
            System.out.println("222222222222222");
            System.out.println(read);
            sun.misc.BASE64Decoder base64 = new sun.misc.BASE64Decoder();
            read = new String(base64.decodeBuffer(read));
            System.out.println("client said:" + read);
            String msg = "login_ok";
            streamWriter.write(msg);
            streamWriter.flush();
            streamWriter.close();
            streamReader.close();
            
        }
        catch(FileNotFoundException e) {
            e.printStackTrace();
        }
        catch(IOException e) {
           e.printStackTrace();
        }
    }client:public string sendLogin(string xml)
        {
                client = new TcpClient("127.0.0.1", 19999);
                client.ReceiveTimeout = 1000;
                client.SendTimeout = 2000;
                ns = client.GetStream();
                byte[] b = System.Text.Encoding.UTF8.GetBytes(Base64.Base64Code(xml));
                ns.Write(b, 0, b.Length);
                ns.Flush();
                b = new byte[256];
                //***********下行就是接收server返回信息,不加入的话server端就可以接收到这里发送的数据,加入的话server就一直处于等待读取client发送数据的状态,导致这里报错*************/
                Int32 bytes = client.GetStream().Read(b, 0, b.Length);  //就是这句话出错,错误信息是“无法从传输连接中读取数据: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。。”
                string responseData = System.Text.Encoding.UTF8.GetString(b, 0, bytes);
                ns.Close();
                client.Close();
                return responseData;
        }
如果client不加入接收信息的话server端是可以正常执行的:
*********************************************
++++++ 客户请求成功 ++++++
客户:/127.0.0.1在时间:Fri Jul 31 10:41:55 CST 2009访问过!
1111111111
2222222222
client said:jfdklsjfldksjfsdklfjdsfjdsklfjskfjdslfkjfkdjfl
*******************************如果client加入接收信息的话server端就一直停在读取信息上:
*********************************************
++++++ 客户请求成功 ++++++
客户:/127.0.0.1在时间:Fri Jul 31 10:41:55 CST 2009访问过!
1111111111
*******************************

解决方案 »

  1.   

    客户端在把socket传入线程的时候出现了错误
      

  2.   

    有个简单的测试方法,你用telnet 测试,先把服务器端调试成功再说,我感觉
    1  String msg = "login_ok";
    这里的发送字符串还是加上一个回车看看吧2 客户端发送数据,你确认里面一定有换行吗?
      如果没有,那么服务器端的readLine将一直等待,直到
      1) 客户端断开,则视同发送完毕
      2) 收到了换行标志我个人感觉,第二个的可能性极大。
    byte[] b = System.Text.Encoding.UTF8.GetBytes(Base64.Base64Code(xml));这个xml里面99%没有换行