我正在学习套接字,现在我想写文件传输程序。我有服务器部分和客户端部分。服务器部分包含2个端口:5000(命令)和5001(文件)。现在我想通过套接字发送一个文件,当我做了一些错误的事情,因为只有425b的数据正在发送。
以下是客户端发送方法:
private void sendFile(Socket socket) {
File file2 = new File("C:\\Users\\barte\\Desktop\\dos.png");
byte[] bytes = new byte[16 * 1024];
System.out.println(file2.exists());
try (InputStream inputStream = new FileInputStream(file2);
OutputStream outputStream = socket.getOutputStream();
OutputStream secondOutput = new FileOutputStream("C:\\Users\\barte\\Desktop\\received\\dos.png")) {
int count;
while ((count = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, count);
secondOutput.write(bytes, 0, count);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
如您所见(下图),我也在本地编写这个文件,一切正常,所有73kb的数据都被写入。
现在,在服务器端,我正在尝试接收以下文件:
case SEND: {
new Thread(() -> {
printWriter.println("Server is receiving files right now...");
try (ServerSocket serverSocket = new ServerSocket(5001)) {
while (true) {
new FilesTransfer(serverSocket.accept()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
break;
}
和内部文件传输运行方法:
@Override
public void run() {
System.out.println("Hello there");
try {
InputStream inputStream = inSocket.getInputStream();
OutputStream outputStream = new FileOutputStream("C:\\Users\\barte\\Desktop\\received\\file");
byte[] bytes = new byte[16 * 1024];
int count;
while ((count = inputStream.read()) > 0) {
outputStream.write(bytes, 0, count);
}
outputStream.close();
inputStream.close();
inSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
虫子在哪里?为什么在本地一切正常的情况下只发送空字节?
2条答案
按热度按时间1zmg4dgp1#
你可以这样做:
实际上,文件结尾或eof的意思是-1,而您的值大于0,所以取0,它停止了保存文件的连接。
我还建议编写一个逻辑,将文件名作为命令传输到服务器,以便以正确的名称和扩展名保存文件!
bjg7j2ky2#
问题是:
您的代码使用
InputStream.read()
,读取单个字节(或-1
当流结束时)。现在,您正在读取单个字节,将其解释为长度,然后从中写入0x00字节数bytes
到文件。当从流中读取0x00字节时,此操作停止。你需要把这个改成
InputStream.read(byte[])
:也就是说,你必须通过
bytes
,并检查结果是否不等于-1
,如果大于零,则不是(0
),尽管read(byte[])
只会回来0
如果传入的字节数组长度为零,则这不是真正的问题。