我在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()
是正确的。
为什么会这样?
答案 0 :(得分:0)
[该方法返回]读入缓冲区的总字节数, 如果由于流的末尾已经没有更多数据,则返回-1 达到。
因此,如果方法返回-1
,则不是网络错误。标准行为表示Socket或Input / OutputStream已关闭。
我不知道您的整个服务器代码,但似乎您正在尝试重用服务器端先前关闭的套接字。