Java的Socket的write和read的一些问题

今天发现一个问题,也算是底层原理吧(猜测)

我使用Java的网络编程的ServerSocket和Socket制作一个发送文件的软件

结果发现文件大小大于3MB,程序就会卡在 write 函数 示例代码如下,大家可以试一下

ServerSocket server = new ServerSocket(9999);
Socket socket = new Socket("127.0.0.1",9999);
Socket client = server.accept();
long startTime = System.currentTimeMillis();
OutputStream output = socket.getOutputStream();
byte[] b = new byte[100000];
output.write(b);
System.out.println(System.currentTimeMillis() - startTime + "执行完了");

执行代码会发现程序没有任何输出(底层都是调用的write(int); 每次输出一字节,也可以用循环来试一下,看看到哪就不输出了

来研究了一下,并查阅了官方文档,文档里的OutputStream有flush函数(刷新),并标明了OutputStream的flush无用,用于子类实现

如果用FileOutputStream的话指定的是文件,操作系统是接收端(缓冲区应该足够大)

但是在Socket中,获取到的是OutputStream(没有子类实现),所以可以想象通信传输的数据有一条信道(缓冲区),如果你一直write,接收方不接收,缓冲区则会满,也就输出不了了

发布了38 篇原创文章 · 获赞 23 · 访问量 9056

猜你喜欢

转载自blog.csdn.net/qq_41806966/article/details/103975051
今日推荐