我创建了一个聊天程序,要求用户选择客户端或服务器角色。我删除此要求的方法是让每个用户启动自己的服务器,从中获取消息。这应该允许我让两个客户端与另一个客户端通信,而不必在它们之间放置服务器。
现在我已经修改了我的程序,客户端进行了发送,服务器进行了接收。
请注意,两个程序之间的通信完全正常,直到这些更改。但是,现在我已经改变了一些东西,早在创建套接字时就会发生错误。
我的程序流程直到问题如下:
经过一些调试后,我发现永远不会创建这个套接字。
当流程进入此阶段(列表中的最后一项)时,仅执行“第一次测试”。
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)
答案 0 :(得分:0)
这是防火墙问题。您指定的目标端口未在目标防火墙中打开。
服务器可能也没有运行,但如果这是唯一的问题,那就是连接被拒绝&#39;,没有&#39;连接超时:connect& #39;
答案 1 :(得分:-1)
根据定义,套接字是客户端/服务器。您始终需要一个绑定到6666端口的ServerSocket,并侦听来自客户端Socket的传入连接。
两个客户端中的一个是否成功绑定了ServerSocket?