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

时间:2011-01-17 04:45:54

标签: java c linux sockets

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

服务器。

#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。我应该想到一个简单的事情,谢谢!

2 个答案:

答案 0 :(得分:2)

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

这可能是一个网络问题 - 由于防火墙等原因,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”看看你得到了什么。

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

答案 1 :(得分:0)

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

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

  • 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的返回值 - 如果你有一个不行为的程序,并且你没有测试所有的回报代码,你可以打赌(毫无疑问,这是墨菲定律之一),你没有测试的一个电话是失败的。

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