Java通过套接字发送文件
我想通过套接字发送文件以及其他一些信息。我正在使用下面的代码Java通过套接字发送文件
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);
}
传递套接字的输入流的receivefile法,而不是插座本身:
InputStream is = webServerSocket.getInputStream();
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(is));
receiveFile(webServerSocket,filesize,filename);
问题在于,我相信,在事实上,你必须通过由同一插座二个inputstreams在相同的时间点(在实际读取任何数据之前)。它们指向同一个流,但是从一个流中读取也不会移动另一个流,因此,在从输入流BA读取一个流被标记在位置15(例如)而Inpustream A仍然处于流0开始处的采样0时。
(编辑:) 当然,您必须在receiveFile方法中使用inputstream,而不是从套接字中获取一个。另一种解决办法是让从插座中的InputStream调用后接收文件,如
receiveFile(webServerSocket,filesize,filename);
BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(webServerSocket.getInputStream()));
+1:另外一点是,如果你不清楚自己在做什么,你可以使用流作为二进制或文本,但不能同时使用。 ;) – 2011-04-12 13:45:31
我意识到了这个问题。为了简单起见,我只是从inFromServer再次读取以进行刷新。我不想更改代码太多 – Sam 2011-04-12 14:15:58
我可以知道webServerSocket是什么吗? – 2013-07-31 05:48:08
通过阅读该文件后,您将已经阅读整个文件。如果你仍然得到文件的内容,你还没有阅读整个文件。
我可以知道webServerSocket是什么吗? – 2013-07-31 05:47:51