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

时间:2014-10-25 01:23:58

标签: java sockets server

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

3 个答案:

答案 0 :(得分:1)

  

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

解决方案是不使用available()

该方法告诉您有多少字节可用于立即读取 而不会阻塞。如果您使用此信息告诉您"连接已结束",如果另一端或网络无法跟上您的速率,您将获得过早结束读取和处理数据。即使另一端能够跟上,所有需要的只是一个短暂的网络中断,让读者赶上,并且连接到了#34; over" ......根据你的标准。

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

答案 1 :(得分:0)

您应该使用java.net包,这里有关于套接字连接的文档:

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

答案 2 :(得分: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编码的字符串。