Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
做一个客户&;Java中的服务器连接稳定_Java_Sockets_Server - Fatal编程技术网

做一个客户&;Java中的服务器连接稳定

做一个客户&;Java中的服务器连接稳定,java,sockets,server,Java,Sockets,Server,我正在用Java创建一个服务器应用程序,但当客户机连接到服务器并打开一个流时,该流终止,连接丢失。我需要的是,即使流已经结束,也要保持这种连接。下面是一个代码示例,可以更好地解释我的意思: diSTR = new DataInputStream(Conexao.getInputStream()); doSTR = new DataOutputStream(Conexao.getOutputStream()); conectado = true; while

我正在用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.net包,下面是套接字连接的文档:

你误用了。
available()
调用只告诉您可以在不阻塞的情况下读取多少字节。它不会告诉你是否已经到达了河流的尽头。通常,inputstream可能有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());
将读取字节并在到达流结束时返回读取的字节数或
-1
。每次
read()
返回时,缓冲区的内容都会被tearrayoutputstream写入
。一旦读取了所有字节(
read(byte[])
返回
-1
),流的内容就可以解释为UTF-8编码字符串

因此,当Disr.available()=0时,方法返回,连接结束,我如何解决这个问题

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

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

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