1

我需要构建一个可以通过网络接收数据并使用这些数据做一些不相关的事情的应用程序。

这是一段代码,可以清楚地说明我在做什么。

在服务器端:

static Socket client = null;
static ServerSocket ss = null;

if (ss != null) {
                ss.close();
            }
            ss = new ServerSocket(5513);
            isrunning = true;
            System.out.println("Waiting for client...");
            client = ss.accept();
            System.out.println("Client accepted.");
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

和客户端:

Socket client = null;
PrintWriter out = null;
                    try {                            
                        client = new Socket("hostname", 5513);
                        out = new PrintWriter(client.getOutputStream(), true);
    }

请注意,这只是一段代码。代码中没有错误。

运行服务器端代码后,它正确地等待客户端连接。

现在问题来了。一旦我尝试从客户端连接,我就会收到“连接被拒绝”错误。

但是,我在互联网上发现了一些东西,它告诉我尝试从客户端进行远程登录。例如,让服务器端的 IP 为 192.168.1.1。因此,使用此命令后:

    telnet 192.168.1.1 5513

我实际上与服务器建立了连接。该命令将启动一个空屏幕,并且我在命令行中手动键入的所有内容都会在按下回车后发送到服务器端(通过调试检查)。

所以,我可以手动连接到服务器端并发送一些数据,但我的代码拒绝连接。

谁知道我做错了什么?

4

4 回答 4

3

这是您实际使用的代码吗?

client = new Socket("hostname", 5513);

尝试将其更改为:

client = new Socket("192.168.1.1", 5513);
于 2012-04-13T17:04:36.230 回答
2

client = new Socket("hostname", 5513); 主机名需要代表您要连接的 IP 地址。如果您尝试连接到自己,它将是“localhost”

此外,服务器始终没有监听客户端,必须有一个while循环,以便服务器监听并接受连接。

while (true) {
   client = ss.accept();
   out = new PrintWriter(client.getOutputStream(), true);
   //You should probably assign it to a seperate thread to handle stuff for this client
}

我应该解释为什么你会得到那个特定的错误。当某事说连接被拒绝时,通常意味着您要连接的 IP 地址知道您正在发送连接并阻止它,因为它没有侦听该连接。基本上,当服务器关闭时,您停止侦听客户端,因此该端口上的任何内容都会被阻止。当然,另一种情况可能是 Java 在您的防火墙上被阻止,应该为其设置例外。尽管如果您要通过 LAN 完成的工作很少出现这种情况。

于 2012-04-13T17:13:30.177 回答
0

您实际上并没有在客户端的 Socket 对象中使用“主机名”,是吗?

它应该是 192.168.1.1。

于 2012-04-13T17:04:19.073 回答
0

你在 Windows 上吗?如果是这样,您是否已将 java.exe 和 javaw.exe 添加到防火墙并启用了入站和出站?并且您是否在防火墙中添加了 5513 规则?

如果是 Windows 但没有防火墙设置,那就是你的答案,打开你的防火墙。

于 2012-04-13T17:06:27.637 回答