Java 无法创建套接字,引发IOException

Java 无法创建套接字,引发IOException,java,sockets,ioexception,Java,Sockets,Ioexception,我创建了一个聊天程序,要求用户选择客户端或服务器角色。我消除这一要求的方法是让每个用户启动自己的服务器,从中获取消息。这应该允许我让两个客户机彼此对话,而不必在它们之间放置服务器 现在,我修改了我的程序,让客户端发送,服务器接收 请注意,在这些更改之前,两个程序之间的通信工作得非常好。然而,现在我已经更改了一些内容,一个错误早在我创建套接字时就发生了 直到出现问题为止,我的程序流程如下: 节目开始 服务器自动启动,绑定到本地端口6666 连接配置弹出,用户点击保存按钮目标主机和端口被保存 用户单

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

现在,我修改了我的程序,让客户端发送,服务器接收

请注意,在这些更改之前,两个程序之间的通信工作得非常好。然而,现在我已经更改了一些内容,一个错误早在我创建套接字时就发生了

直到出现问题为止,我的程序流程如下:

节目开始 服务器自动启动,绑定到本地端口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上创建链接后,问题仍然出现。经审查,这是有道理的

当我的调试器指向第二条测试消息之后初始化出站的行时,套接字的值为null

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

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

这没什么用

完整的源代码可以找到更好的概述

编辑:从第一个主要错误打印stacktrace

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)

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


服务器也可能没有运行,但如果这是唯一的问题,那么它将是“连接被拒绝”,而不是“连接超时:连接”。

打印异常的错误消息;这对于确定异常发生的原因非常有用。您是否尝试过netstat-tupln并检查该端口是否已绑定到其他端口?@Vulcan:我现在已经添加了它。不知道为什么我以前没有想过。@noMAD:乍一看,我没有看到任何绑定到6666或66667的端口。然而,当连接超时错误发生时,我使用了netstat-a。我到底应该查找什么?您的套接字似乎超时,因为它无法连接到目标服务器套接字。当您尝试将套接字连接到主机:端口时,是否确定该端口上的必要服务器套接字已启动并正在运行?