1

我已经有这个问题一段时间了,虽然我的努力和我的朋友帮助我似乎无法克服这个问题。

我的问题是我正在尝试使用套接字在客户端和服务器之间建立连接,这实际上很常见,但由于某种原因,客户端似乎无法连接到服务器,不知道为什么,这是我解决问题的尝试

1- 我使用http://portforward.com/打开我的路由器上使用的“zhone”类型的端口 2- 我多次更改端口,每次我使用 PFPortChecker 来查看我的端口是否打开

我的代码相当简单,它打开服务器,当客户端连接到它时,服务器发送日期和时间

我的服务器代码看起来像这样

public class DateServer {

    /** Runs the server. */
    public static void main(String[] args) throws IOException {
        ServerSocket listener = new ServerSocket(6780);
        try {
            while (true) {
                Socket socket = listener.accept();
                try {
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println(new Date().toString());
                } finally {
                    socket.close();
                }
            }
        } finally {
            listener.close();
        }
    }
}

我的客户代码看起来像这样

public class DateClient {

    /** Runs the client as an application. First it displays a dialog box asking for the IP address or hostname of a host running the date server, then connects to it and displays the date that it serves. */
    public static void main(String[] args) throws IOException {
        //I used my serverAddress is my external ip address 
        Socket s = new Socket(serverAddress, 6780);
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String answer = input.readLine();
        JOptionPane.showMessageDialog(null, answer);
        System.exit(0);
    }
}

即使我继续尝试

3-我关闭了防火墙以防万一

4-我在我的服务器套接字中添加了连接超时

经过我所有的尝试,我总是得到这个错误

Exception in thread "main" 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 DateClient.main(DateClient.java:13)

注意 DateClient.java:13 是这一行 Socket s = new Socket(serverAddress, 6780);

请帮我解决这个问题,在此先感谢

4

2 回答 2

1
  • 关闭服务器端的 PrintWriter
  • 确保使用 localhost(尝试 127.0.0.1)作为服务器地址。根据您连接 Internet 的方式,外部 Internet 地址(如 Web 上的各种“获取我的 ip”工具所示)可能与您的网络接口配置的实际地址不同,并且不能在同一台机器上工作。更多在这里
于 2013-05-15T18:37:50.030 回答
1

我试着运行你的代码。首先, localhost (127.0.0.1) 可以解决您的问题。另一方面,我将端口和 IP 更改为我自己的,它工作正常(甚至是我的外部 IP)。所以你的端口/IP可能有问题。

  • 如果它使用 localhost 工作,您的 IP 不是正确的,或者您的计算机上的某些东西阻止了外部连接。您的客户端代码应如下所示,由于某种原因new Socket(String host, int port)无法正常工作。

    public class DateClient {
    
    /** Runs the client as an application. First it displays a dialog box asking for the IP address or hostname of a host running the date server, then connects to it and displays the date that it serves. */
    public static void main(String[] args) throws IOException {
        //I used my serverAddress is my external ip address 
        InetAddress serverAddress = InetAddress.getByName(String host);
        Socket s = new Socket(serverAddress, 6780);
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String answer = input.readLine();
        JOptionPane.showMessageDialog(null, answer);
        System.exit(0);
    }
    

    }

  • 如果使用 localhost 不起作用,则说明您的端口未正确转发。尝试登录到您的路由器并从那里转发端口。

事实上,就像@Audrius Meškauskas 所说,您可能想在关闭服务器之前关闭服务器上的 PrintWriter listener

于 2013-05-15T19:00:23.510 回答