我有一个gui,我点击一台电脑上的发送按钮和另一台电脑上的接收按钮,它发送文件。问题是我只能发送一次文件,然后我必须重新启动应用程序。
它失败的原因是: "套接字已关闭"在发送电脑上,虽然我不明白为什么会这么说。 "&的ArrayIndexOutOfBounds#34;在接收电脑上。
我有两种用于发送数据的方法:
public void StreamIn() throws Exception { //FOR RECEIVING FILES
byte[] mybytearray = new byte[size];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVE);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray, 0, mybytearray.length);
current = bytesRead;
do {
bytesRead = is.read(mybytearray, current, (mybytearray.length - current));
if (bytesRead >= 0) current += bytesRead;
} while (bytesRead > -1);
bos.write(mybytearray, 0, current);
bos.flush();
if (fos != null) fos.close();
if (bos != null) bos.close();
}
public void StreamOut() throws Exception { //FOR SENDING FILES
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray, 0, mybytearray.length);
os = sock.getOutputStream();
os.write(mybytearray, 0, mybytearray.length);
os.flush();
if (bis != null) bis.close();
if (os != null) os.close();
}
由于某种原因,OutputStream不会再写第二次,虽然我在尝试发送另一个文件之前关闭并重新创建它们。我不明白为什么发送电脑会说插座已关闭。
答案 0 :(得分:1)
发送一个文件后你正在关闭套接字。如果要发送另一个文件,请打开另一个套接字。
注意您的副本循环在StreamIn()
中是正确的但在StreamOut().
中不正确您假设read()
填充缓冲区,并且您还假设mybytearray
是与文件一样大,因此您也假设文件大小适合int.
在Java中复制流的规范方法是:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
在两种方法中都使用它。
flush()
之前的close()
也是多余的。
同样StreamOut()
缺少mybytearray.