做一个客户&;Java中的服务器连接稳定
我正在用Java创建一个服务器应用程序,但当客户机连接到服务器并打开一个流时,该流终止,连接丢失。我需要的是,即使流已经结束,也要保持这种连接。下面是一个代码示例,可以更好地解释我的意思:做一个客户&;Java中的服务器连接稳定,java,sockets,server,Java,Sockets,Server,我正在用Java创建一个服务器应用程序,但当客户机连接到服务器并打开一个流时,该流终止,连接丢失。我需要的是,即使流已经结束,也要保持这种连接。下面是一个代码示例,可以更好地解释我的意思: diSTR = new DataInputStream(Conexao.getInputStream()); doSTR = new DataOutputStream(Conexao.getOutputStream()); conectado = true; while
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
。这意味着“流结束”,并表示另一端已关闭,不再有任何数据