0

我正在尝试建立一个简单的客户端和服务器连接。但是,服务器似乎没有适当地绑定到端口。

我用于服务器的代码如下所示:

class Server extends Thread
{
    public boolean running = true;

    public Server(Main main) throws IOException
    {
        super();
        ServerSocket server_sock = new ServerSocket(8123);

        while (running)
        {
            new Connector(server_sock.accept(), main);
        }
        server_sock.close();
    }
}

class Connector extends Thread
{
    public Connector(Socket c)
    {
        super();
        system.out.println("Connecting"+c.getRemoteSocketAddress()+":"+c.getLocalPort());
        c.setKeepAlive(true);
        //wait for the connection to end
        system.out.println("Disconnecting"+c.getRemoteSocketAddress()+":"+c.getLocalPort());
    }
}

客户端很简单,我只想连接到服务器(下面显示的行是通过其主程序中的另一个程序运行的):

s = new Socket("127.0.0.1", 8123); // Start
s.close(); // Stop

会发生什么:服务器运行并且不抛出任何异常。希望我在抛出异常的地方运行客户端Exception in thread "main" java.net.ConnectException: Connection refused: connect

所以我做了一个简单的python客户端和服务器对来检查Java服务器/客户端:

服务器:

from socket import *

s = socket(AF_INET, SOCK_STREAM)
s.bind(('', 8123))
s.listen(1)
conn, addr = s.accept()
print("CONNECTED: ", addr)
conn.close()

客户:

from socket import *

s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 8123))
s.close()

我用 python 客户端测试了 python 服务器作为健全性测试,效果很好。我用java客户端测试了python服务器,他们都合作得很好。但是,python 客户端和 java 系列都不起作用。我的 python 服务器提供了错误:

Traceback (most recent call last):
  File "C:\Users\SIGABRT\Desktop\tcp.py", line 4, in <module>
    s.connect(('localhost', 8123))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

这通常意味着服务器未正确启动。那么我在使用 Java 服务器客户端时做错了什么?

4

1 回答 1

0

我有同样的问题。对我来说,这样做很有帮助

s = new Socket("localhost", 8123);

我想知道为什么它不适用于IP ...

解释

至少在我的 Ubuntu 系统上,似乎new ServerSocket(port)建立了与 IPv6 的连接 - “127.0.0.1”是 IPv4,无法连接到正在设置的套接字。另一种方法是初始化服务器套接字

new ServerSocket(port, 32, Inet4Address.getByName("127.0.0.1"));

我不知道在通过环回地址使用时,在 IPv6 上使用 IPv4 是否会产生真正的差异(性能方面)。

于 2013-04-12T19:00:17.877 回答