gpt4 book ai didi

java - Socket OutputStream.write() 阻塞行为

转载 作者:行者123 更新时间:2023-12-02 10:02:19 27 4
gpt4 key购买 nike

这是我的客户端程序:

public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 6123);
DataOutputStream dos =
new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

File file = new File("/Users/prashantpandey/Desktop/737_cdu_preflight.mp4");
Long fileLength = file.length();
System.out.println("File's Length is: " + fileLength + " bytes");

InputStream is = new FileInputStream(file);

byte[] bytes = new byte[8192];

OutputStream os = socket.getOutputStream();

int count = 0;
int counter = 0;
while ((count = is.read(bytes)) > 0) {
System.out.println(counter++);
System.out.println("Writing bytes: " + count);
System.out.println("About to write the above bytes");
os.write(bytes, 0, count);
System.out.println("Finished writing the above bytes");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

对于服务器运行的每个循环,我让它 hibernate 15 秒。我观察到客户端将 8192 个字节的数据非常快速地写入套接字的 OutputStream 中大约 100 次,然后阻塞很长时间。另一方面,服务器在每个循环中不断从套接字的 InputStream 读取数据。

这是我的服务器:

public class Server {
public static void main(String[] args) {
try {

System.out.println("Entry thread: " + Thread.currentThread().getName());
ServerSocket ss = new ServerSocket(6123);

System.out.println("Waiting for accept: " + Thread.currentThread().getName());
Socket socket = ss.accept();


DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

int count = 0;
byte[] buffer = new byte[8192];

while ((count = dis.read(buffer)) > 0) {
System.out.println("Printing Received Data: \n" + new String(buffer));
Thread.sleep(15000);
}


} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}

正如我提到的,服务器在每个循环中不断读取数据。它始终可以在套接字上读取。

有人可以向我解释为什么客户端线程在大约 100 次计数后等待这么长时间吗?操作系统级别发生了什么?

最佳答案

假设每次读取服务器后都会 hibernate 15 秒,并且客户端全速发送数据,那么在服务器上的下一次读取发生之前,套接字缓冲区和缓冲输出流很可能已完全填满。因此,客户端将被阻塞,等待缓冲输出流中(以及间接在套接字缓冲区中)可用的空间,因为这种情况只会以每 15 秒 8192 字节(最大)的增量发生,最终客户端将每 15 秒最多只能发送 8192 字节。

从服务器中删除 sleep ,问题就会消失。

关于java - Socket OutputStream.write() 阻塞行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com