套接字传输文件:内容为空

时间:2011-11-24 17:00:18

标签: java sockets file-transfer fileinputstream fileoutputstream

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

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

解决

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

3 个答案:

答案 0 :(得分:1)

也许你正在关闭客户端上错误的套接字。当您关闭套接字时,您将关闭类字段this.socket而不是本地变量socket

此外,当您关闭文件的输出流时,您不必同时关闭BufferedOutputStreamFileOutputStream。当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);
}