【问题标题】:Make a client & server connection stable in Java在 Java 中使客户端和服务器连接稳定
【发布时间】:2014-12-20 21:56:50
【问题描述】:

我正在用 Java 创建服务器应用程序,但是当客户端连接到服务器并打开流时,流到达并结束连接丢失。我需要的是即使在流结束时也能保持该连接处于活动状态。这是一个代码示例,可以更好地解释我的意思:

     diSTR = new DataInputStream(Conexao.getInputStream());
     doSTR = new DataOutputStream(Conexao.getOutputStream());
     conectado = true;
     while (diSTR.available() > 0)
     {
        byte[] buffer = new byte[size];
        diSTR.readFully(buffer);
        String str = new String(buffer, "UTF-8");
        log(str);
     }

那么当diSTR.available()返回0方法返回并且连接结束时,我该如何解决这个问题呢?

【问题讨论】:

    标签: java sockets server


    【解决方案1】:

    那么当diSTR.available() = 0 方法返回并且连接结束时,我该如何解决这个问题呢?

    解决方案是不要使用available()

    该方法告诉您现在可以读取多少字节而不会阻塞。如果您使用它来告诉您“连接结束”,那么如果另一端或网络无法跟上您读取和处理数据的速率,您将获得一个过早端.即使另一端可以跟上,只要短暂的网络中断让读者赶上,连接就会“结束”……根据您的标准。

    执行此操作的正确方法是只读取输入流,直到读取调用返回-1。这意味着“流结束”,表示另一端已经关闭,不会再有任何数据了。

    【讨论】:

      【解决方案2】:

      您可能应该使用 java.net 包,这里是套接字连接的文档:

      http://docs.oracle.com/javase/tutorial/networking/sockets/

      【讨论】:

        【解决方案3】:

        您误用了InputStream.available()available() 调用仅告诉您可以读取多少字节没有阻塞。它不会告诉您是否已到达流的末尾。通常输入流可能有 0 个字节要立即读取但仍处于打开状态。

        你的 while 循环可以这样重构

        int count;
        byte[] buffer = new byte[4096];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        while((count = diSTR.read(buffer)) != -1){
            baos.write(buffer, 0, count);
        }
        String str = new String(baos.toByteArray(), "UTF-8")
        log(sb.toString());
        

        InputStream.read(byte[]) 将读取字节并返回读取的字节数或到达流末尾时返回-1。每次read() 返回时,缓冲区的内容都会写入ByteArrayOutputStream。一旦读取了所有字节(read(byte[]) 返回-1),流的内容就可以被解释为 UTF-8 编码的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多