document 1:package com.network;import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerSocketTest { public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(4000);
Socket socket = serverSocket.accept(); // 产生 Socket 对象,试图和服务器连接.
InputStream in = socket.getInputStream();// 获得输入流.
OutputStream out = socket.getOutputStream();// 获得输出流.
byte[] buffer = new byte[100];// 用于存储输入流读取的字节.
int len = 0;
// while (-1 != (len = in.read(buffer, 0, buffer.length))) {
// String s = new String(buffer, 0, len);
// System.out.println(s);
// } len = in.read(buffer, 0, buffer.length);
System.out.println(new String(buffer, 0, len)); out.write("Welcome".getBytes());// 向服务器发送信息.
in.close();
out.close();
socket.close();
}}document 2:package com.network;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientSocket { public static void main(String[] args) throws UnknownHostException,
IOException {
Socket socket = new Socket("127.0.0.1", 4000); // new Socket 对象,试图和服务器连接.
OutputStream out = socket.getOutputStream(); // 获得输出流.
InputStream in = socket.getInputStream(); // 获得输入流.
try {
Thread.sleep(3000); // 为了防止没能向服务器写信息,让线程睡眠.
} catch (InterruptedException e) {
e.printStackTrace();
}
out.write("Hello".getBytes()); // 向服务器发送信息.
byte[] buffer = new byte[100]; // 用于存储输入流读取的字节.
int len = 0;
// while (-1 != (len = in.read(buffer, 0, buffer.length))) {
// String s = new String(buffer, 0, len);
// System.out.println(s);
// } len = in.read(buffer, 0, buffer.length);
System.out.println(new String(buffer, 0, len));
out.close();
in.close();
socket.close();
}}
问题:上面是我简单模拟服务器和客户端信息的发送和接收。
我发现在两个document中,在 InputStream read 的时候,如果用 我注释的代码代替下面的两行,就会出现服务器能收到客户端发的信息,但是客户端收不到信息。
如果像现在我注释的代码,就会都能正常接收,好奇怪的问题哈····谁能知道是什么情况呢?

解决方案 »

  1.   

    我发现 代码:

    while (-1 != (len = in.read(buffer, 0, buffer.length))) {
     String s = new String(buffer, 0, len);
     System.out.println(s);
     }

    在(服务器)有问题,但是这段代码在(客户端)没有问题!
      

  2.   

    无论是接收还是发送,都是会阻塞主线程的,你要先这么思考问题。
    也就是说,如果你企图接收信息,而对方并没有发送的情况下,会持续阻塞在read()函数。
    反之如果你企图拼命发送信息,而对方没有接收的情况下,当发送缓冲区满也会持续阻塞在write()函数。
    所以要打破这个结构,那么一般来说“接收”最好是独立线程来处理,无论是服务器端还是客户端。