无法创建套接字,抛出IOException

时间:2013-02-01 17:35:23

标签: java sockets ioexception

我创建了一个聊天程序,要求用户选择客户端或服务器角色。我删除此要求的方法是让每个用户启动自己的服务器,从中获取消息。这应该允许我让两个客户端与另一个客户端通信,而不必在它们之间放置服务器。

现在我已经修改了我的程序,客户端进行了发送,服务器进行了接收。

请注意,两个程序之间的通信完全正常,直到这些更改。但是,现在我已经改变了一些东西,早在创建套接字时就会发生错误。

我的程序流程直到问题如下:

  • 程序启动
  • 服务器自动启动,绑定到本地端口6666
  • 弹出连接配置,用户单击保存按钮(保存目标主机和端口)
  • 用户点击连接按钮
  • 程序创建客户端线程
  • 线程创建套接字并启动出站流

经过一些调试后,我发现永远不会创建这个套接字。

当流程进入此阶段(列表中的最后一项)时,仅执行“第一次测试”。

public void run() {
            System.out.println("First test");
            createConnection();
            System.out.println("Second test");
            initiateIO();
    }

private void createConnection() {
        try {
            socket = new Socket(host, port);
        } catch (UnknownHostException e) {
            OutputUtil.showErrorMessage("Couldn't bind socket to unknown host", "Unknown host");
        } catch (IOException e) {
            OutputUtil.showErrorMessage("General IO error at creating client socket", "IO error");
        }
    }

private void initiateIO() {
        try {
            outbound = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            OutputUtil.showErrorMessage("Couldn't load IO streams from client", "IO Error");
        }
    }

输出:

Console: First test
Popup: General IO error at creating client socket
Console: Second test
Console: NPE at `outbound.close()`

我假设NPE是第一个错误的结果,考虑到在创建PrintWriter时调用套接字的方法。还应注意,显示第一个错误大约需要10秒钟。

起初我认为可能会引入错误,因为本地服务器和与其他客户端的连接都使用端口6666,但是在端口6667上创建链接后问题仍然存在。这在审查时有意义。

当我的调试器指向初始化outbound的行时(在“第二次测试”消息之后,套接字具有值null

我的问题是:为什么不能创建套接字?文档仅指定

  

IOException - 如果在创建套接字时发生I / O错误。

没什么用。

可以找到完整的源代码here以获得更好的概述。

编辑:从第一个主要错误中打印堆栈跟踪。

java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at core.Client.createConnection(Client.java:30)
    at core.Client.run(Client.java:64)
    at java.lang.Thread.run(Unknown Source)

2 个答案:

答案 0 :(得分:0)

这是防火墙问题。您指定的目标端口未在目标防火墙中打开。

服务器可能没有运行,但如果这是唯一的问题,那就是连接被拒绝&#39;,没有&#39;连接超时:connect& #39;

答案 1 :(得分:-1)

根据定义,套接字是客户端/服务器。您始终需要一个绑定到6666端口的ServerSocket,并侦听来自客户端Socket的传入连接。

两个客户端中的一个是否成功绑定了ServerSocket?