我的JAVA应用程序向服务器(command = filename.ini)发送命令。当服务器收到此命令时,它通过Socket发送filename.ini内容。
我遇到的第一个问题是只接收文件的部分内容。在我使用while(in.available()!=0){//write bytes}
的代码中发生了这种情况,因为in.available()
不知道文件内容有多大/多长。如果我使用while((numBytesRead = dis.read(buffer)) != -1){//write bytes}
,则循环永远不会终止,因为Socket连接始终保持打开状态。我的问题是一旦收到每个字节,我怎么能终止循环呢?请帮帮我,我已经尝试了一切。我明白错误在哪里,但我不知道如何解决它。
以下是我目前的代码部分:
public class TCPClient {
protected Socket s = null;
public DataInputStream in = null;
public TCPClient(InetAddress ipa, int port) {
Socket s1 = null;
try { //Open the socket.
s1 = new Socket(ipa.getHostAddress(), port);
} catch (IOException ex) {
System.out.println("Error opening socket!");
return;
}
s = s1;
try { //Create an input stream.
in = new DataInputStream(new BufferedInputStream(s.getInputStream()));
} catch (Exception ex) {
System.out.println("Error creating input stream!");
}
}
public synchronized byte[] receive() {
byte[] buffer = new byte[0];
ByteArrayOutputStream getBytes = new ByteArrayOutputStream();
try {
while (in.available() == 0) {
} //Wait for data.
} catch (IOException ex) {
}
try {
int numBytesRead;
buffer = new byte[1024];
while ((numBytesRead = dis.read(buffer, 0, 1024)) != -1) { //LOOP NEVER ENDS HERE BECAUSE CONNECTION IS ALWAYS OPEN
getBytes.write(buffer, 0, numBytesRead);
}
} catch (IOException ex) {
}
return (getBytes.toByteArray());
}
}
答案 0 :(得分:2)
您需要定义一个微协议来说明接收器文件的长度,或者在完成发送文件后关闭服务器上的连接。第一种方法是优选的,因为它更健壮一点。在客户端上,您也应该有一个超时,以避免在出现网络问题时永远等待。
微协议的澄清:在发送文件本身之前,发送包含文件长度的32位(或64位,如果需要)位整数。客户端应读取该整数,然后开始检索该文件。