【问题标题】:Java sending files through socketsJava通过套接字发送文件
【发布时间】:2011-04-12 13:31:22
【问题描述】:

我想通过套接字发送文件以及其他一些信息。我正在使用以下代码

 public void receiveFile(Socket socket,int filesize,String filename) throws IOException
{
    //after receiving file send ack
    System.out.println("waiting ");
 // int filesize=70; // filesize temporary hardcoded

long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
// localhost for testing
System.out.println("Connecting...");

// receive file
byte [] mybytearray  = new byte [filesize];
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(filename);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
System.out.println("recv..."+mybytearray.length);
do {
   bytesRead =
      is.read(mybytearray, current, (mybytearray.length-current));
   System.out.println(bytesRead);
   if(bytesRead > 0) current += bytesRead;
} while(bytesRead > 0);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
System.out.println(" File received");
}

收到文件后,我必须接收一些其他的字符串。但是当我尝试读取输入流时,我得到了文件的内容。如何从输入流中刷新文件的内容。

BufferedReader inFromServer =
            new BufferedReader(new InputStreamReader(
                webServerSocket.getInputStream()));

receiveFile(webServerSocket,filesize,filename);
    while(true)
    {
        msg = inFromServer.readLine(); //here i receive the contents of the file again
     System.out.println(msg);
    }

【问题讨论】:

  • 我能知道 webServerSocket 是什么吗?

标签: java sockets


【解决方案1】:

将套接字的输入流传递给接收文件方法,而不是套接字本身:

InputStream is = webServerSocket.getInputStream();
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(is));

receiveFile(webServerSocket,filesize,filename);

我认为,问题在于您在同一时间点(在实际读取任何数据之前)有来自同一个套接字的两个输入流。它们指向同一个流,但从一个流中读取也不会移动另一个流,因此在从 inputstreamBA 读取之后,一个被标记在位置 15(例如),而 inpustream A 仍处于位置 0,在流的开头。

(编辑:) 当然,您必须在 receiveFile 方法中使用输入流,而不是从套接字中获取一个。另一种解决方案是在调用接收文件后从套接字获取输入流,如

receiveFile(webServerSocket,filesize,filename);

BufferedReader inFromServer =
            new BufferedReader(new InputStreamReader(webServerSocket.getInputStream()));

【讨论】:

  • +1:另一点是,除非您非常清楚自己在做什么,否则您将流用作二进制文件或文本,但不能同时使用两者。 ;)
  • 我意识到了这个问题。为了简单起见,我只是从 inFromServer 再次读取以刷新。我不想更改代码太多
  • 我能知道 webServerSocket 是什么吗?
【解决方案2】:

通过阅读完整的文件,您将阅读整个文件。如果您仍在获取文件的内容,则说明您尚未阅读整个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2011-02-24
    • 2020-12-21
    • 2015-07-24
    相关资源
    最近更新 更多