gpt4 book ai didi

java - 套接字传输文件

转载 作者:行者123 更新时间:2023-11-29 07:21:06 24 4
gpt4 key购买 nike

我有一个像这样的 Java 服务器类:

ServerSocket servsock = new ServerSocket(63456);
boolean read = false;
while (!read) {
Socket sock = servsock.accept();
int length = 1024;
byte[] mybytearray = new byte[length];
OutputStream os = sock.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
while (true) {
int i = bis.read(mybytearray, 0, mybytearray.length);
if (i == 1) {
break;
}
os.write(mybytearray, 0, mybytearray.length);
os.flush();
}
sock.close();
read = true;
}

`而客户端是这样的:

Socket sock = new Socket("127.0.0.1", 63456);
byte[] mybytearray = new byte[1024];
InputStream is = sock.getInputStream();
FileOutputStream fos = new FileOutputStream("C:/tmp/NEWtmp.rar");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int bytesRead = is.read(mybytearray, 0, mybytearray.length);
while(bytesRead != -1 ) {
bos.write(mybytearray, 0, bytesRead);
bytesRead = is.read(mybytearray, 0, mybytearray.length);
}
bos.close();
sock.close();

一个问题是:为什么循环不会在文件末尾停止?第二个问题是,为什么也这么慢?

最佳答案

它不会停止,因为

if (i == 1) {

在你的服务器源应该是

if (i == -1) {

或者,如果你想要真正安全:

if (i <= 0) {

此外,您还可能使用此行冒数据损坏的风险:

os.write(mybytearray, 0, mybytearray.length);

您应该将其更改为:

os.write(mybytearray, 0, i);

关于性能——将 os.flush(); 调用移到 while 循环之外。当您刷新网络流时,您是在强制它向网络发送任何缓冲数据。这迫使网络层发送和确认 1024 字节的 TCP 有效载荷(当然是更大的以太网有效载荷),这可能比您的 PMTU 小得多。您只需要在发送完数据或希望客户端立即接收缓冲数据时刷新。从每次迭代中删除刷新调用将允许操作系统级网络缓冲区完成其工作,并将数据分段为尽可能少的数据包。

关于java - 套接字传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4385288/

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