无法响应Java中的非本地套接字
我正在尝试用Java制作一个客户机-服务器程序。实际上,客户端可以与我的服务器计算机取得联系,因为在我的路由器上为端口7777设置了转发。因此,我很好地收到了他们的信息。 一旦我从客户机收到消息,我就打开套接字对象(我不关闭任何输入或输出流),然后尝试发回消息。我没有得到任何例外,所以我非常确定消息可以很好地传递到套接字的IP,我甚至尝试过用自己的服务器计算机发送和应答消息,效果很好。因此,通过保持套接字,我确实知道客户端的IP地址,并且消息可以很好地到达客户端的路由器。我认为没有发生的是,路由器没有将消息传递给该客户端,因为它不必知道消息。无法响应Java中的非本地套接字,java,sockets,inputstream,outputstream,Java,Sockets,Inputstream,Outputstream,我正在尝试用Java制作一个客户机-服务器程序。实际上,客户端可以与我的服务器计算机取得联系,因为在我的路由器上为端口7777设置了转发。因此,我很好地收到了他们的信息。 一旦我从客户机收到消息,我就打开套接字对象(我不关闭任何输入或输出流),然后尝试发回消息。我没有得到任何例外,所以我非常确定消息可以很好地传递到套接字的IP,我甚至尝试过用自己的服务器计算机发送和应答消息,效果很好。因此,通过保持套接字,我确实知道客户端的IP地址,并且消息可以很好地到达客户端的路由器。我认为没有发生的是,路由
我现在有点迷路了,快把我逼疯了。谢谢。可能是您可以尝试flush()方法。可能是您可以尝试flush()方法。可能是服务器正在关闭套接字而您未连接。java中有不同的方法来检查它,很少有效,也很少无效。以下是有关检查客户端是否已连接的详细信息: socket.getInputStream().read()使线程在客户端连接时等待输入,从而使程序不运行 做任何事情-除非您得到一些输入返回-1如果客户端 断开 socket.isConnected()在客户端连接后(甚至在断开连接后)始终返回true 客户端断开连接后,out.checkError()即为真 真正找到答案的唯一方法是阅读(返回值为-1) 值)或写入(将抛出IOException(断开的管道) 关联的输入/输出流 一旦确定连接到服务器,就只有您可以跳到服务器上查找路由器或网络是否有问题
希望有帮助 可能是服务器正在关闭套接字而您未连接。java中有不同的方法来检查它,很少有效,也很少无效。以下是有关检查客户端是否已连接的详细信息: socket.getInputStream().read()使线程在客户端连接时等待输入,从而使程序不运行 做任何事情-除非您得到一些输入返回-1如果客户端 断开 socket.isConnected()在客户端连接后(甚至在断开连接后)始终返回true 客户端断开连接后,out.checkError()即为真 真正找到答案的唯一方法是阅读(返回值为-1) 值)或写入(将抛出IOException(断开的管道) 关联的输入/输出流 一旦确定连接到服务器,就只有您可以跳到服务器上查找路由器或网络是否有问题
希望有帮助 给我们看看代码。或者更好的是,只是代码的相关部分。您如何测试它?Telnet连接到您的服务器?我建议
ping
同时连接服务器和客户端,看看是否可以从两端连接到它们显示代码。或者更好的是,只是代码的相关部分。您如何测试它?Telnet到您的服务器?我建议ping
服务器和客户端,看看它们是否可以从两端Socket访问。isConnected()
告诉您是否连接过Socket
。它不会告诉您任何有关连接当前状态的信息out.checkError()
在写入时出现IOException
后返回true,因为PrintStream
和PrintWriter
抑制异常,这是不通过网络使用它们的一个很好的理由。客户端断开连接后,不会立即变为真。如果连接被中止,读取也会抛出一个IOException
,而不是返回-1。这里的错误太多了-1@EJP仅供参考Socket.isConnected不工作。你可以自己试试。checkError()刷新流并检查其错误状态,因此如果断开连接,则返回true。@JunedAhsan-我们知道!如果您想了解原因,请阅读javadoc。如果一个方法的行为与指定的行为完全一致,那么它就没有什么“奇怪”的地方了。这里唯一“奇怪”的事情是,你一开始就懒得读javadoc:-)@JunedAhsan-而且checkError
只有在OP使用PrintWriter
或PrintStream
时才有效,而这在他的情况下不太可能是一个合适的选择。Socket.isConnected()
告诉您是否连接过插座
。它不会告诉您任何有关连接当前状态的信息out.checkError()
在写入时出现IOException
后返回true,因为PrintStream
和PrintWriter
抑制异常,这是不通过网络使用它们的一个很好的理由。客户端断开连接后,不会立即变为真。如果连接被中止,读取也会抛出一个IOException
,而不是返回-1。这里的错误太多了-1@EJP仅供参考Socket.isConnected不工作。你可以自己试试。checkError()刷新流并检查其错误状态,因此如果断开连接,则返回true。@JunedAhsan-我们知道!如果您想了解原因,请阅读javadoc。如果一个方法的行为与指定的行为完全一致,那么它就没有什么“奇怪”的地方了。这里唯一“奇怪”的事情是,你一开始就没有读javadoc:-)@JunedAhsan-和checkError<