Java - 套接字和文件发送/接收随机工作

时间:2016-11-22 18:29:47

标签: java file sockets

我在Java中使用套接字有问题。我已经实现了Server和Client来进行通信并将文件从客户端发送到服务器。 问题是有时方法in.read(buffer)给我-1而不是实际文件长度。它几乎随机发生。

服务器部分:

InputStream in = socket.getInputStream();
OutputStream out = new FileOutputStream(file);
System.out.println("Server: Will receive file...");
byte[] buffer = new byte[4096];
int length = in.read(buffer);
System.out.println("Server: will get " + length + " byte");

while (length > 0){
    out.write(buffer, 0, length);
    System.out.println("Server: reading !");
    length = in.read(buffer);
}

System.out.println("Server: got file, length: " + file.length());

in_code.close();
out.close();
in.close();

客户端:

public void sendFileToServer(String s) throws IOException{
    try{
        clientSocket = new Socket(ip, port);
    }catch (Exception e){
        e.printStackTrace();
    }

    File file = new File(s);
    String filename = file.getName();
    this.sendCode(filename);

    // Get the size of the file
    long length = file.length();

    System.out.println("Client: send file name: " +filename);
    System.out.println("Client: send file length: " +length);

    byte[] bytes = new byte[1024];
    InputStream in = new FileInputStream(file);
    OutputStream out = clientSocket.getOutputStream();
    int count;

    while ((count = in.read(bytes)) > 0) {
        System.out.println("Client send !!!");
        out.write(bytes, 0, count);
    }

    out.close();
    in.close();
    this.clientSocket.close();
}

服务器部分当然是在while循环中。无法粘贴所有代码,因为它有很多代码。

所以客户端正在调用sendFileToServer()方法 - 让我们说5次。循环中一个接一个。 有时服务器获取所有文件正确,有时一些文件为0,因为in.read(缓冲区)给出-1。但另一方面,客户端in.read()是正确的。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

InputStream#read(byte[])州的文件:

  

[该方法返回]读入缓冲区的总字节数,   如果由于流的末尾已经没有更多数据,则返回-1   达到。

因此,如果方法返回-1,则不是网络错误。标准行为表示Socket或Input / OutputStream已关闭。

我不知道您的整个服务器代码,但似乎您正在尝试重用服务器端先前关闭的套接字。