0

我正在通过套接字在两台计算机之间传输文件。一切似乎都正常,但是当我查看检索到的文件的内容时,它是空的。我究竟做错了什么?

这是我的服务器端代码。文件 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();
}

解决了

由于我使用多个线程和多个套接字并在一台机器上测试所有连接,我只是遇到了一个问题,即客户端(其中包含客户端和服务器代码)将与其自身而不是另一个客户端连接。为不同的运行客户端更改文件传输端口使这一切正常工作。感谢所有看过这个并给我一些建议的人。

4

3 回答 3

1

也许您在客户端上关闭了错误的套接字。当您关闭套接字时,您关闭的是类字段this.socket而不是局部变量socket

此外,当您关闭文件的输出流时,您不必同时关闭BufferedOutputStreamFileOutputStream. FileOutputStream关闭时自动BufferedOutputStream关闭。

还有一件事——您不必在关闭输出流之前刷新它。当您调用close()流时,会自动刷新。

于 2011-11-24T17:09:44.680 回答
0

我唯一想到的是你实际上永远不会开始接收文件,因为服务器端不读取命令("get foobar.txt"),所以客户端在发送命令时冻结。

客户端文件的存在可能来自以前的测试。

但是,我不确定这是不是问题所在。这只是尝试提供帮助。

于 2011-11-24T17:27:56.063 回答
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);
}
于 2011-11-24T21:23:09.547 回答