java - 只能发送一次文件

时间:2014-09-04 23:46:24

标签: java networking

我有一个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不会再写第二次,虽然我在尝试发送另一个文件之前关闭并重新创建它们。我不明白为什么发送电脑会说插座已关闭。

1 个答案:

答案 0 :(得分:1)

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

注意您的副本循环在StreamIn()中是正确的但在StreamOut().中不正确您假设read()填充缓冲区,并且您还假设mybytearray是与文件一样大,因此您也假设文件大小适合int.

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

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

在两种方法中都使用它。

flush()之前的close()也是多余的。

同样StreamOut()缺少mybytearray.

的声明