关于socket中使用ObjectInputStream类对象造成的阻塞问题

今天在写网络传输相关代码时,意外发现了这个问题,以前没注意到,今天发现了就把记录下来

下面是相关的测试代码来说明该问题

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();

    }
}

再次运行服务端,然后运行客户端,

运行结果:

客户端便没有阻塞住了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值