【问题标题】:Java Socket Method Blocks When 'connect' is called调用“连接”时的 Java 套接字方法块
【发布时间】:2012-04-14 06:19:54
【问题描述】:

在回答之前,请注意这是客户端问题,而不是服务器问题。由于我在终端使用 telnet 连接到服务器,并且 telnet 能够连接到服务器。现在,我不知道为什么connect方法无法连接我同时使用了本地主机地址和服务器的私有IP地址。它只是阻塞,从不调用回调方法。

                client.connect(new InetSocketAddress(hostname, 1993));
                callback.onConnection(); // Never invokes!
                OutputStream writer = client.getOutputStream();
                InputStream reader = client.getInputStream();
                byte[] buffer = new byte[1024 * 1024];

P.S 我是不是做错了什么。这不可能是防火墙问题,因为 telnet 能够连接到服务器,而且我认为我没有防火墙,因为我在我的 Ubuntu 机器上运行此代码。服务器和客户端都使用 TCP 协议,客户端和服务器端都没有抛出异常。任何关于可能出错的建议都非常有用。我可以显示更多代码,例如服务器代码。服务端用 C++ 编写,客户端用 Java 编写。

编辑:

我终于能够建立连接。我没有使用连接方法,而是使用套接字的构造函数来调用连接。我不知道为什么连接不起作用?

代码修改如下:

            client = new Socket(hostname, port);
            callback.onConnection();
            OutputStream writer = client.getOutputStream();
            InputStream reader = client.getInputStream();
            byte[] buffer = new byte[1024 * 1024];
            reader.read(buffer);

【问题讨论】:

  • 建议:获取 Wireshark 的副本并跟踪 3 次握手中发生的情况:wireshark.org

标签: java sockets


【解决方案1】:

我想你正在使用阻塞套接字,所以connect 方法将阻塞执行,直到建立连接。例如,您可以尝试使用http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/channels/SocketChannel.html 创建非阻塞套接字

【讨论】:

  • 我通过使用构造函数进行连接来解决它,例如 new Socket(hostname, port);
【解决方案2】:

您是否尝试在调用 connect 之前检查地址上的 isUnresolved()?

【讨论】:

    【解决方案3】:

    我终于能够建立连接。我没有使用连接方法,而是使用套接字的构造函数来调用连接。我不知道为什么连接不起作用?

    代码修改如下:

            client = new Socket(hostname, port);
            callback.onConnection();
            OutputStream writer = client.getOutputStream();
            InputStream reader = client.getInputStream();
            byte[] buffer = new byte[1024 * 1024];
            reader.read(buffer);
    

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 2021-10-28
      • 2010-09-22
      • 2013-02-02
      • 1970-01-01
      • 2021-03-05
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多