Java - 从Socket读取文件(while循环永远不会结束)

时间:2011-11-24 14:31:09

标签: java

我的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());
    }
}

1 个答案:

答案 0 :(得分:2)

您需要定义一个微协议来说明接收器文件的长度,或者在完成发送文件后关闭服务器上的连接。第一种方法是优选的,因为它更健壮一点。在客户端上,您也应该有一个超时,以避免在出现网络问题时永远等待。

微协议的澄清:在发送文件本身之前,发送包含文件长度的32位(或64位,如果需要)位整数。客户端应读取该整数,然后开始检索该文件。