无法将Java客户端连接到C服务器

我有一个用C编写的非常简单的服务器和一个用Java编写的同样简单的客户端。 当我在同一台计算机上运行它们时,一切正常,但是当我尝试在计算机A和计算机B上的客户机上运行服务器时,我从java客户端收到错误IOException连接被拒绝 。 我似乎无法找出发生了什么,有什么想法吗? 我甚至关闭了防火墙,但问题仍然存在。

服务器。

#include  #include  #include  #include  #include  #include  #define PORT 3557 #define BUF 256 int main(int argc, char *argv[]) { struct sockaddr_in host, remote; int host_fd, remote_fd; int size = sizeof(struct sockaddr);; char data[BUF]; host.sin_family = AF_INET; host.sin_addr.s_addr = htonl(INADDR_ANY); host.sin_port = htons(PORT); memset(&host.sin_zero, 0, sizeof(host.sin_zero)); host_fd = socket(AF_INET, SOCK_STREAM, 0); if(host_fd == -1) { printf("socket error %d\n", host_fd); return 1; } if(bind(host_fd, (struct sockaddr *)&host, size)) { printf("bind error\n"); return 1; } if(listen(host_fd, 5)) { printf("listen error"); return 1; } printf("Server setup, waiting for connection...\n"); remote_fd = accept(host_fd, (struct sockaddr *)&remote, &size); printf("connection made\n"); int read = recv(remote_fd, data, BUF, 0); data[read] = '\0'; printf("read = %d, data = %s\n", read, data); shutdown(remote_fd, SHUT_RDWR); close(remote_fd); return 0; } 

客户。

 import java.net.*; import java.io.*; public class socket { public static void main(String[] argv) { DataOutputStream os = null; try { Socket socket = new Socket("192.168.1.103", 3557); os = new DataOutputStream(socket.getOutputStream()); os.writeBytes("phone 12"); os.close(); socket.close(); } catch (UnknownHostException e) { System.out.println("Unkonw exception " + e.getMessage()); } catch (IOException e) { System.out.println("IOException caught " + e.getMessage()); } } } 

编辑:

感谢大家的快速反应(我很震惊)。 由于使用telnet和nc的建议,我解决了这个问题。 我发现我的防火墙阻塞了服务器计算机上的端口3557。 我应该想到一件简单的事,谢谢!

有许多可能的问题,你应该开始并尝试查明有问题的部分。

这可能是一个网络问题 – 由于防火墙等原因,B可能无法连接到A。

要检查这一点,您可以从A上的B运行端口扫描开始( nmap -p 3557 192.168.1.103 ,检查端口是否对计算机B开放)。

如果它看起来是开放的,你可以尝试从B而不是你的客户端连接telnet / nc来查看服务器是否按预期工作: telnet 192.168.1.103 3557nc 192.168.1.103 3557并且一旦连接写“phone 12”并看看是什么你得到。

这些应该可以帮助您了解导致问题的部分,服务器,客户端或网络。

好吧,首先要做的是相信错误信息:如果你得到“连接被拒绝”,则假设另一端拒绝连接。 那么问题是为什么?

几乎总是,事实certificate这是一个简单的“愚蠢的错误”。 在深入了解之前,请检查:

  • IP地址和端口是正确的
  • 没有备用进程也试图使用端口3557(虽然这通常会给出不同的错误消息)
  • 在尝试连接之前,服务器端运行并保持I / O等待状态
  • 当在同一台机器上运行时,两端工作。

假设所有这些工作,然后使用telnet(1)尝试连接到服务器。 如果它能够工作,telnet应该能够读取另一端。

推荐实际上有两个参数,主机和端口:

 $ telnet 192.168.1.103 3557 

应该连接到任一台机器上的服务器,当然

 $ telnet localhost 3557 

应该在服务器端系统上工作。

如果程序只要你在同一个系统上工作,而不是远程,你就会遇到某种路由或防火墙问题。 (确保没有“智能”开关尝试限制防火墙正在执行的操作之外的某些端口。)

如果程序无法在同一系统上运行,请确保服务器正在等待I / O,并尝试使用telnet技巧。 如果服务器没有停止等待I / O,请阅读库调用标志的手册页。 没有人记得他们所有人; 其中一些有你不会注意到的神秘副作用。

如果服务器停止等待I / O并且telnet将无法连接,则添加一些printfs以确保它按计划进行。 特别是,看一下acceptrecv的返回值 – 如果你有一个没有表现的程序,并且你还没有测试过所有的返回代码,那么你可以打赌(毫无疑问,这是Murphy的法律之一)您未测试的其中一个呼叫失败。

如果您可以通过telnet连接并成功键入数据,请转到Java。 尝试将os FileOutputStream ,看看它是否符合您的预期。