【问题标题】:Java client receives from C server, but C server does't receive from Java ClientJava客户端从C服务器接收,但C服务器没有从Java客户端接收
【发布时间】:2017-12-29 13:49:21
【问题描述】:

我用 C 语言创建了一个简单的服务器,并用 Java 创建了一个简单的客户端,作为大型应用程序中功能的替代品。我能够将客户端连接到服务器,并且客户端能够接收来自服务器的消息。但是,当我尝试从服务器中的客户端接收消息时,我什么也得不到。经过一番研究,我相当有信心我的客户应该可以工作,所以我觉得问题一定出在接收方,但我真的不确定问题是什么,因为我使用了基本相同的 C其他应用程序的代码没有问题。如果有人可以帮助我解决这个问题,我将非常感激。

这是简单的 Java 代码:

public static void main(String[] args) {
    try{
        Socket sock = new Socket("localhost",9000);
        BufferedReader inputBuffer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        String line = inputBuffer.readLine();
        System.out.println("From server : "+line);
        PrintWriter out = new PrintWriter(sock.getOutputStream());
        String toSend = "I am sending you a message. I sure hope you get it.\n";

        out.write(toSend.toCharArray());
        out.flush();
        out.close();
    }catch(Exception e)
    {

    }

这是我的 C 代码:

int main(int argc, char** argv) {

int port = 9000;
int buffer_size = 256;

int sock;
int new_sock;
socklen_t client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
char* line_status;
int len;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
    printf("Couldn't open socket.\n");
}

bzero((char*) &server_address, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(port);

int status = bind(sock, 
                  (struct sockaddr *) & server_address, 
                  sizeof(server_address));

if(status < 0)
{
    printf("Error binding to socket.\n");
}

listen(sock, 5);
client_len = sizeof(client_address);
printf("Listening for clients on port %d...\n", port);
new_sock = accept(sock, 
                  (struct sockaddr *) &client_address, 
                  &client_len);

if(new_sock < 0)
{
    printf("Error accepting connection.\n");
}else
{
    printf("Connected\n");
    char outbuffer[] = "123456789\n";

    int write_stat = write(new_sock, outbuffer, 10);
    printf("wrote message to socket\n");

    char buffer[buffer_size];
    int read_stat = 0;
    while(read_stat <= 0)
    {
        char c;
        read_stat = read(port,buffer, buffer_size);
        if(read_stat >0)
        {
            printf("read_stat = %d\n",read_stat);
            printf("received message: %s\n",buffer);
        }

    }
    printf("done\n");

}
return 0;

}

【问题讨论】:

  • 任何read()recv() 调用如果没有将结果存储到变量中和/或没有分别测试零和-1,则写入不正确。
  • 格式化/缩进,以及@EJP 所说的内容。
  • and,(不可避免?),'printf("received message: %s\n",buffer);' - 在未安全 NUL_terminated 的缓冲区上使用需要 NUL 终止字符串的调用(如果您完全正确地处理了读取返回的结果,则可以避免这种情况,如 EJP 发布的那样)。
  • 应该是printf("received message %.*s\n", read_stat, buffer)。无需终止任何内容。而read_stat 对于计数变量的命名很糟糕。 @MartinJames
  • @EJP 是一个替代方案,当然:)

标签: java c sockets tcp


【解决方案1】:

您不想从“端口号”中读取数据

... = read(port,buffer, buffer_size);

但来自接受的套接字

... = read(new_sock, buffer, buffer_size);

提示如果您在调用read() 时添加了完整的错误检查处理,您会立即绊倒这个错误。错误检查正在免费调试!


与您的特定问题无关的注释:从代码使用 socklen_t 我得出结论,您在 Windows 上 不是。所以read()write() 最有可能返回ssize_t 不是 int

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2017-06-22
    • 2012-06-14
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多