Java通过套接字发送文件

3
我希望通过套接字发送文件以及其他一些信息。我正在使用以下代码。
 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 是什么吗? - Nitesh Verma
2个回答

4
将套接字的输入流传递给receivefile方法,而不是直接传递套接字本身:
InputStream is = webServerSocket.getInputStream();
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(is));

receiveFile(webServerSocket,filesize,filename);

我认为问题在于您在同一时间点(在实际读取任何数据之前)从同一套接字中获得了两个输入流。它们指向相同的流,但是从一个流中读取不会使另一个流也移动,因此在从inputstreamBA读取后,该流标记在位置15(例如),而inpustream A仍然在流的开头,即位置0。
(编辑:) 当然,在receiveFile方法中必须使用inputstream而不是从套接字获取一个。另一种解决方案是在调用receive file之后从套接字获取inputstream,如下所示:
receiveFile(webServerSocket,filesize,filename);

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

另一个要点是,除非你非常清楚自己在做什么,否则你应该将流用作二进制或文本,而不是同时使用两者。 ;) - Peter Lawrey
我意识到问题所在。为了保持简单,我只是从inFromServer重新读取数据直到刷新。我不想改变太多的代码。 - Sam
我可以知道什么是webServerSocket吗? - Nitesh Verma

1
通过完整地读取文件,您将已经读取了整个文件。如果您仍在获取文件的内容,则表示您尚未读取整个文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接