今天在写网络传输相关代码时,意外发现了这个问题,以前没注意到,今天发现了就把记录下来
下面是相关的测试代码来说明该问题
public class Server01 {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
Thread.sleep(1000*1200);//避免服务端过快退出
serverSocket.close();
socket.close();
}
}
//测试socket配合ObjectInputStream类对象造成的阻塞问题
public class Client01 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
A a = new A(socket);
}
}
class A {
Socket socket;
ObjectOutputStream objectOutputStream;
ObjectInputStream objectInputStream;
public A(Socket socket) throws IOException {
this.socket = socket;
try {
InputStream inputStream = socket.getInputStream();
this.objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
this.objectInputStream = new ObjectInputStream( inputStream );
System.out.println("你好...");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
运行服务端后运行客户端,发现客户端并没有打印出
"你好..."
经过调试发现,客户端阻塞在了
this.objectInputStream = new ObjectInputStream( inputStream );
经过查阅资料,和翻看源码,大致得出结论:在new一个ObjectInputStream类对象时,如果对应的套接字对端没有数据发送过来,那么将会阻塞在new这个位置,直到对端发送数据过来
所以修改服务端代码,让服务端发送数据过来,测试一下结论是否可靠
public class Server01 {
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeInt(1);//随便向对端写了个数据
Thread.sleep(1000*1200);//避免服务端过快退出
serverSocket.close();
socket.close();
}
}
再次运行服务端,然后运行客户端,
运行结果:
客户端便没有阻塞住了