-1

我正在用 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方法返回并且连接结束时,我该如何解决这个问题呢?

4

3 回答 3

1

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

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

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

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

于 2014-10-25T02:24:03.317 回答
0

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

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

于 2014-10-25T01:39:17.997 回答
0

你在滥用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 编码的字符串。

于 2014-10-25T02:23:10.673 回答