【问题标题】:Sockets in Java...?Java中的套接字...?
【发布时间】:2012-04-13 17:00:22
【问题描述】:

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

这里有一段代码来说明我在做什么。

在服务器端:

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

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

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

有谁知道我做错了什么?

【问题讨论】:

  • 我不确定你的失败的确切原因,但我使用这两个教程轻松运行了套接字:android-er.blogspot.com/2011/01/…android-er.blogspot.com/2011/01/simple-communication-using.html
  • @HannahMitt,他忘记了while 循环。服务器甚至没有超过一秒钟的时间来监听连接。一旦服务器建立 ONE 连接,它就完成了,不再监听。
  • 正如我所说,这只是一段代码。实际上,我正在使用 while 循环。此外,accept() 方法会等待连接建立,所以我可以让服务器等待几个小时来建立第一个连接。之后,它将循环到另一个连接的开始。
  • 这是一个完整的例子:stackoverflow.com/a/22079083/3315914

标签: java sockets telnet


【解决方案1】:

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

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

尝试将其更改为:

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

【讨论】:

    【解决方案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 完成的工作很少出现这种情况。

    【讨论】:

    • 这很尴尬,用IP地址替换主机名确实有效。
    • 输入主机名适用于局域网连接,因为我之前已经测试过它确实建立了连接。但为了让您的连接更加准确,我会坚持使用 IP 地址。更不用说这种方法更直接和直接。我只会将主机名用于网站连接。唯一的例外是“localhost”,意思是“我的电脑的 IP 地址”
    【解决方案3】:

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

    应该是 192.168.1.1。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 2017-08-10
        • 1970-01-01
        • 2013-02-02
        • 2021-07-19
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多