2012-04-13 30 views
1

我需要建立一个应用程序,它可以接收来自网络的数据并使用这些数据做一些不相关的事情。Java中的套接字...?

下面是一段代码,以表明我在做什么。

在服务器端:

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键(通过调试进行检查)后,手动键入命令行中的所有内容都将发送到服务器端。

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

任何知道我在做什么的人都是错的?

+0

我不确定你为什么失败,但是我使用这两个教程轻松运行套接字:http://android-er.blogspot.com/2011/01/implement-simple-socket-server-in。 html 和http://android-er.blogspot.com/2011/01/simple-communication-using.html – HannahMitt 2012-04-13 17:05:43

+0

@HannahMitt,他忘了'while'循环。服务器甚至不会在超过一秒的时间内监听连接。一旦服务器建立一个连接,它就完成了,不再听了。 – 2012-04-13 17:35:20

+0

正如我所说,这只是一段代码。实际上,我正在使用while循环。此外,accept()方法将等待连接建立,所以我可以让服务器等待几个小时来建立第一个连接。之后,它将循环到另一个连接的开始。 – 2012-04-14 11:48:01

回答

3

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

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

尝试将其更改为:

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

工作正常!谢谢。 – 2012-04-13 17:27:47

0

你实际上并没有在客户端的Socket对象中使用“hostname”吗?

它应该是192.168.1.1。

0

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

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

2

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

另外,服务器在所有时间都没有监听客户端,因此必须有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。

+0

这很尴尬,用实际工作的IP地址替换主机名。 – 2012-04-13 17:27:18

+0

输入主机名适用于局域网连接,因为我之前已经测试过,它确实建立了连接。但为了提高连接的准确性,我会坚持使用IP地址。更不用说那种方法更直接和直接。我只会使用主机名进行网站连接。唯一的例外是“localhost”,意思是“我的电脑的IP地址” – 2012-04-13 17:32:26