我一直在从事一个小型服务器/客户端项目,但遇到了一个阻碍我进步的小问题。
我想我已经确定了程序(客户端和服务器)的核心,并且我设法将两者连接起来,localhost
但是当我尝试通过我的外部 IP 连接时,我得到了一个异常:
java.net.ConnectException: Connection refused
java.net.PlainSocketImpl.socketConnect(Native Method)
java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
java.net.Socket.connect(Socket.java:529)
java.net.Socket.connect(Socket.java:478)
java.net.Socket.<init>(Socket.java:375)
java.net.Socket.<init>(Socket.java:218)
networking.Client.run(Client.java:183)
java.lang.Thread.run(Thread.java:680)
最初我尝试使用端口 10,但发现 0 到 1023 之间的端口由于某种原因在 Mac 上不起作用,所以我选择了该范围之外的端口。连接localhost
工作但当我尝试连接我的外部 IP(就像普通用户一样)时,我得到了那个例外。我的端口已正确转发并且正在运行sudo lsof -i tcp -nP
(netstat
对于 Mac)将表明实际上我的服务器实际上正在侦听正确的端口。这让我相信问题可能出在我的客户身上,但我真的不知道。
这是sudo lsof -i tcp -nP
Terminal.app 的输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 35423 MeshulamSilk 41u IPv6 0xc949f3cdb29dfdcd 0t0 TCP *:63370 (LISTEN)
java 35423 MeshulamSilk 42u IPv6 0xc949f3cdbbf1b96d 0t0 TCP [::1]:63992->[::1]:63991 (TIME_WAIT)
我知道这些帖子有点乱,所以我把代码上传到了 Gist。如果有人想让我在这里添加它,请告诉我,我会的。
需要注意的一些事项:
- MooConsole 是我编写的一个库,它为导出的程序提供控制台。我在客户端和服务器中都使用它来显示文本。
- MooCommands 是我的另一个库,它代表您可以从控制台运行的命令。
- SocketThread 是一个处理新连接的类。这使服务器可以同时连接多个客户端。它延伸
java.lang.Thread
. 我不认为它会导致问题,所以我不包括它,但如果有必要,我可以。 Operations.DISCONNECT
是一个枚举常量,表示断开连接。
如果有人知道我做错了什么或我根本没有做的事情以及其他任何事情,请告诉我,我将不胜感激。