[英]can't connect Java client to C server
我有一个用C编写的非常简单的服务器和一个用Java编写的同样简单的客户端。 当我在同一台计算机上同时运行它们时,一切正常,但是当我尝试在计算机A上运行服务器并在计算机B上运行客户端时,收到Java客户端拒绝的错误IOException连接 。 我似乎无法找出正在发生的事情,有什么想法吗? 我什至关闭了防火墙,但问题仍然存在。
服务器。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#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 3557
或nc 192.168.1.103 3557
,一旦连接,请输入“ phone 12”并查看你得到。
这些应该可以帮助您了解导致问题的原因是服务器,客户端还是网络。
好吧,首先要做的就是相信错误消息:如果您遇到“拒绝连接”的情况,请假定另一端拒绝了该连接。 那么问题是为什么?
几乎总是,事实证明这是一种简单的“愚蠢的错误”。 在进行任何深入操作之前,请检查以下内容:
假设所有这些工作都能完成,然后使用telnet(1)尝试并连接到服务器。 如果可以正常工作,则telnet应该能够读取另一端。
该命令实际上接受两个参数,host和port:
$ telnet 192.168.1.103 3557
应该连接到任一台机器上的服务器,当然
$ telnet localhost 3557
应该在服务器端系统上工作。
如果这些程序只要在同一系统上就可以正常运行,而不能在远程系统上运行,则说明存在某种路由或防火墙问题。 (确保您没有试图限制防火墙之外的某些端口的“智能”开关。)
如果程序无法在同一系统上运行,请确保服务器正在等待I / O,然后尝试telnet技巧。 如果服务器没有停止等待I / O,请阅读手册页中有关库调用的标志的信息。 没有人记得所有这些。 其中一些具有您不会注意到的神秘副作用。
如果服务器停止等待I / O并且telnet无法连接,则添加一些printfs以确保它按计划进行。 特别是,请看一下accept
和recv
的返回值-如果您的程序行为不正常,并且尚未测试所有返回码,则可以打赌(毫无疑问,这是墨菲定律之一)您未测试的呼叫之一失败。
如果您可以通过telnet连接并成功键入数据,请继续使用Java。 尝试使os
成为FileOutputStream
,看看它是否符合您的期望。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.