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 在socket和serversocket之间打开多个流_Java_Sockets_Stream_Serversocket - Fatal编程技术网

Java 在socket和serversocket之间打开多个流

Java 在socket和serversocket之间打开多个流,java,sockets,stream,serversocket,Java,Sockets,Stream,Serversocket,我正在用Java创建一个简单的聊天,它可以正常工作。我只是在客户端关闭连接时遇到了一个问题,因为它会继续在线显示。这是因为无法知道流何时关闭 我在谷歌上搜索,但任何解决方案都没有解决我的问题,所以我想每隔300毫秒发送一个布尔值,如果没有收到任何答案或出现错误,我可以关闭连接服务器端 问题是流中存在冲突,我不知道我是在读取布尔值还是文本,因此有时我的CheckConnection类尝试读取字符串,而我的SocketHandler类尝试读取布尔值,我收到一个错误。 我使用类ObjectInputS

我正在用Java创建一个简单的聊天,它可以正常工作。我只是在客户端关闭连接时遇到了一个问题,因为它会继续在线显示。这是因为无法知道流何时关闭

我在谷歌上搜索,但任何解决方案都没有解决我的问题,所以我想每隔300毫秒发送一个
布尔值
,如果没有收到任何答案或出现错误,我可以关闭连接服务器端

问题是流中存在冲突,我不知道我是在读取
布尔值还是文本,因此有时我的
CheckConnection
类尝试读取字符串,而我的
SocketHandler
类尝试读取
布尔值,我收到一个错误。
我使用类
ObjectInputStream
ObjectOutputStream
读取和写入流

这是我的第一个服务器应用程序,我对它不太了解,我不知道是否可以打开多个流,或者是否有其他解决方案,所以我问你。我能做什么


PS:我试图创建一个
PrintStream
并执行
checkError()
方法,但它总是返回false,即使我显式关闭了客户端的所有流。谢谢。

我建议您使用文本,因为它一开始就更简单

  • 将任何消息视为心跳。如果获得数据,连接仍然良好
  • 将心跳视为字符串,将聊天视为字符串。这都是一个字符串,所以你不必担心它是什么
  • 检查流是否打开,方法是尝试从中读取数据,并期望在超时时间内获得某些内容
您可以使用BufferedReader或Scanner读取文本。您可以使用BufferedWriter编写文本

在您的字符串中,您可以创建这样一个更简单的协议

say [to-whom] [message ...]
为了你的心跳

hb

您可以添加如下命令

login [user] [password]

要解码消息,请查看第一个单词,您知道它的用途,然后阅读
的第二个单词,比如说
,字符串的其余部分就是消息


要测试协议,您可以将
telnet
发送到端口,并直接向服务器键入内容。您甚至不需要首先编写客户端。

展示一些代码可能是个好主意,我不知道您是如何做到这一点的
say nobody hi
login [user] [password]
kthxbye