我正在通过套接字在两台计算机之间传输文件。一切似乎都有效,但是当我查看检索到的文件的内容时,它是空的。我做错了什么?
这是我的服务器端代码。文件foobar.txt存在,其内容为“hello world!”。
try{
ServerSocket ssock = new ServerSocket(12345);
Socket sock = ssock.accept();
//here I get the filename from the client, but that works fine.
File myFile = new File("foobar.txt");
byte[] mybytearray = new byte[(int) myFile.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
bis.read(mybytearray, 0, mybytearray.length);
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
sock.close();
} catch (Exception e){
e.printStackTrace();
}
这是我的客户代码:
try {
Socket socket = new Socket(host, port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.print("get foobar.txt\r\n");
out.flush();
byte[] streamIn = new byte[1024];
InputStream in = socket.getInputStream();
FileOutputStream file_src = new FileOutputStream("foobar.txt");
BufferedOutputStream file_writer = new BufferedOutputStream(file_src);
int i;
while ((i = in.read()) != -1) {
file_writer.write(i);
}
file_writer.flush();
file_writer.close();
file_src.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
解决
由于我使用多个线程和多个套接字并在一台机器上测试所有连接,我只是遇到了一个问题,即客户端(其中包含客户端和服务器代码)将与自身连接而不是另一个客户。更改不同运行客户端的文件传输端口使这一切都能正常工作。感谢所有看过这个并给我一些建议的人。
答案 0 :(得分:1)
也许你正在关闭客户端上错误的套接字。当您关闭套接字时,您将关闭类字段this.socket
而不是本地变量socket
。
此外,当您关闭文件的输出流时,您不必同时关闭BufferedOutputStream
和FileOutputStream
。当FileOutputStream
关闭时,BufferedOutputStream
会自动关闭。
还有一件事 - 你不必在关闭之前刷新输出流。当您拨打close()
时,会自动刷新流。
答案 1 :(得分:0)
我唯一想到的是你实际上从未开始接收文件,因为服务器端没有读取命令("get foobar.txt"
),所以客户端冻结发送命令。 / p>
客户端文件的存在可能来自之前的测试。
但是,我不确定这是不是问题。这只是一个尝试帮助。
答案 2 :(得分:0)
除了其他人所说的,你忽略了 bis.read()的结果。不能保证填充缓冲区。见Javadoc。
在Java中复制流的正确方法是两端:
byte[] buffer = new byte[8192]; // or whatever
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}