【问题标题】:Cannot respond to a non local socket in Java无法响应 Java 中的非本地套接字
【发布时间】:2013-05-25 06:36:15
【问题描述】:

我正在尝试用 Java 制作一个客户端-服务器程序。实际上客户端可以与我的服务器计算机取得联系,因为转发设置为我路由器上的端口 7777。因此,我很好地收到了他们的消息。 一旦我从客户端收到消息,我会保持套接字对象打开(我不关闭任何输入或输出流),然后尝试发回消息。我根本没有遇到任何异常,所以我很确定消息可以很好地传递到套接字的 IP,我什至尝试过用我自己的服务器计算机发送和应答,它工作正常。所以发生的事情是,通过保持套接字,我确实知道来自客户端的 IP 地址,并且消息可以很好地到达客户端的路由器。我认为没有发生的是路由器不会将消息传递给该客户端,因为它不必知道它。 我现在有点迷路了,这让我快疯了。谢谢

【问题讨论】:

  • 向我们展示代码。或者更好的是,只是代码的相关部分。
  • 你如何测试这个? Telnet 到您的服务器?
  • 我建议服务器和客户端都ping 看看它们是否可以从两端访问

标签: java sockets inputstream outputstream


【解决方案1】:

也许你可以试试flush()方法。

【讨论】:

    【解决方案2】:

    可能是服务器正在关闭套接字而您没有连接。 java中有不同的方法可以检查它,很少有工作,很少有没有。以下是有关检查客户端是否已连接的详细信息:

    socket.getInputStream().read() 使线程等待输入,只要客户端连接,因此使您的程序不 做任何事情——除非你得到一些输入,如果客户端返回 -1 断开连接

    socket.isConnected() 一旦客户端连接(甚至在断开连接之后)总是返回真值!!

    out.checkError() 客户端断开后立即为真

    真正找出答案的唯一方法是阅读(你会得到 -1 作为回报 值)或写入(将抛出 IOException(损坏的管道)) 关联的输入/输出流。

    一旦你确定,你已经连接到服务器,那么只有你应该跳过去看看路由器或网络是否有问题。

    希望对你有帮助!

    【讨论】:

    • Socket.isConnected() 告诉您是否曾经连接过Socket。它不会告诉你关于 connection 的当前状态的任何信息。 out.checkError() 在写入时返回 true after 有一个 IOException,因为 PrintStreamPrintWriter 抑制异常,这是不在网络上使用它们的一个很好的理由。它确实 become true as soon as the client has disconnected。如果连接被中止,读取也可以抛出IOException 而不是返回-1。这里错误太多。 -1
    • @EJP 仅供参考 Socket.isConnected 不起作用。你可以自己试试。 checkError() 刷新流并检查其错误状态,因此如果断开连接则返回 true。
    • @JunedAhsan - 我们知道!如果您想了解原因,请阅读 javadoc。一个方法的行为与指定的行为完全一致,这并没有什么“奇怪”的地方。这里唯一“奇怪”的事情是你一开始就没有费心去阅读 javadoc :-)
    • @JunedAhsan - 只有当 OP 使用 PrintWriterPrintStream 时,checkError 才有效,而这在他的情况下不太可能是一个合适的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2021-10-28
    • 2017-08-31
    相关资源
    最近更新 更多