繁体   English   中英

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

[英]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 3557nc 192.168.1.103 3557 ,一旦连接,请输入“ phone 12”并查看你得到。

这些应该可以帮助您了解导致问题的原因是服务器,客户端还是网络。

好吧,首先要做的就是相信错误消息:如果您遇到“拒绝连接”的情况,请假定另一端拒绝了该连接。 那么问题是为什么?

几乎总是,事实证明这是一种简单的“愚蠢的错误”。 在进行任何深入操作之前,请检查以下内容:

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

假设所有这些工作都能完成,然后使用telnet(1)尝试并连接到服务器。 如果可以正常工作,则telnet应该能够读取另一端。

该命令实际上接受两个参数,host和port:

$ telnet 192.168.1.103 3557

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

$ telnet localhost 3557

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

如果这些程序只要在同一系统上就可以正常运行,而不能在远程系统上运行,则说明存在某种路由或防火墙问题。 (确保您没有试图限制防火墙之外的某些端口的“智能”开关。)

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

如果服务器停止等待I / O并且telnet无法连接,则添加一些printfs以确保它按计划进行。 特别是,请看一下acceptrecv的返回值-如果您的程序行为不正常,并且尚未测试所有返回码,则可以打赌(毫无疑问,这是墨菲定律之一)您未测试的呼叫之一失败。

如果您可以通过telnet连接并成功键入数据,请继续使用Java。 尝试使os成为FileOutputStream ,看看它是否符合您的期望。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM