java-只能发送一次文件

java-只能发送一次文件,java,networking,Java,Networking,我有一个gui,我在一台电脑上单击发送按钮,在另一台电脑上单击接收按钮,它就会发送文件。问题是我只能发送一次文件,然后我必须重新启动应用程序 它给出的失败原因如下: 发送pc上的“套接字已关闭”,尽管我不明白为什么会这样说。 接收pc上的“ArrayIndexOutOfBounds” 我有两种发送数据的方法: public void StreamIn() throws Exception { //FOR RECEIVING FILES byte[] mybytearray =

我有一个gui,我在一台电脑上单击发送按钮,在另一台电脑上单击接收按钮,它就会发送文件。问题是我只能发送一次文件,然后我必须重新启动应用程序

它给出的失败原因如下: 发送pc上的“套接字已关闭”,尽管我不明白为什么会这样说。 接收pc上的“ArrayIndexOutOfBounds”

我有两种发送数据的方法:

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不会再次写入,尽管我在尝试发送另一个文件之前关闭并重新创建了它们。我不明白为什么发送pc会说套接字已关闭。

您在发送一个文件后正在关闭套接字。如果要发送另一个文件,请打开另一个套接字

注意:您的复制循环在
StreamIn()
中是正确的,但在
StreamOut()中是不正确的。
您假设
read()
填充了缓冲区,并且您还假设
mybytearray
与文件一样大,因此您也假设文件大小适合
整数。

Java中复制流的规范方法是:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
这两种方法都可以使用

另外,
close()
之前的
flush()
也是多余的


另外
StreamOut()
缺少
mybytearray的声明。

谢谢您的回答,但是这段代码中的“缓冲区”是什么?而且,如果不最终关闭outputstream,我无法阅读。这也会关闭套接字吗?我看到它也会关闭套接字,解决方案是使用socket.shutdownOutput()edit不是一个真正的解决方案:在这之后不能重用outputstream