【问题标题】:Client socket is not receiving a string客户端套接字未接收到字符串
【发布时间】:2011-11-25 22:55:00
【问题描述】:

我创建了一个简单的客户端服务器套接字程序并发送一个字符串 a|b|c|* 并且客户端没有收到它。客户端在另一台机器上。

服务器代码。

String format = "a|b|c|*";
ServerSocket ss = new ServerSocket(2222);
System.out.println("Server Started.");

while (true) {              
    Socket s = ss.accept();
    System.out.println("Connection accepted.");
    InputStream is = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    PrintStream ps = new PrintStream(s.getOutputStream());
    ps.println(format);             
    ps.flush();
    System.out.println("Format sent.");
}    

客户端

try {
    Socket s = new Socket("192.168.0.71", 2222);
    // step 3: Get I/O streams
    InputStream is = s.getInputStream();
    InputStreamReader isr= new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    String format = br.readLine();
    System.out.println(format);
} catch(Exception ex){
    System.out.println(ex.getMessage());
}

当我在同一台机器上创建客户端时,它正在接收字符串,而当我将此字符串传递给另一台机器客户端时,它没有接收到它。

【问题讨论】:

  • 会发生什么?有没有例外?它是否连接但未获取任何数据?
  • @Peter,是的,它确实连接但没有获取任何数据。
  • 当你使用telnet到主机和端口,在同一个盒子和另一个盒子上,你得到什么? telnet 192.168.0.71 2222
  • 并且没有这样的例外。当我在我的机器上运行客户端时,它确实接收到数据。当我在另一台机器上运行客户端时没有获取数据。
  • 当我远程登录时,它会显示我从服务器发送的字符串。

标签: java sockets


【解决方案1】:

所以我在我的两个盒子上尝试了你的代码,远程连接工作正常。一堆好的cmets,但我想我会写一个答案,尝试一些事情:

  1. 暗示您已经能够在本地远程登录到服务器并查看格式字符串。美好的。您是否还能够从远程客户端使用 telnet 到服务器并看到格式字符串?

  2. 如果远程 telnet 不起作用,那么我会检查是否有防火墙或路由问题。你能从客户端ping服务器吗?

  3. telnet 可能不起作用的另一个原因是您的服务器可能绑定到错误的端口。默认是绑定到所有接口,但为了确定,你应该检查一下。如果您使用的是 unix 机器或 OSX,那么您可以使用 netstat 命令查看您绑定到的端口。以下输出显示服务器绑定到*,即所有接口。

    $ netstat -an | grep 2222     
    tcp46      0      0  *.2222                 *.*                    LISTEN
    
  4. 如果没有其他帮助,请意识到如果您连接了 telnet,它将阻止所有其他 telnet 和客户端连接,因为您没有关闭服务器上的套接字。

希望这能有所帮助。

【讨论】:

  • 现在说无法连接到目标 ipAddress:portNmumber
  • 如果 telnet 说他们有某种防火墙在路上或者你的服务器不工作。启动您的服务器,在本地尝试 telnet,尝试 telnet off box 但在关闭网络时,远程尝试 telnet。