【问题标题】:sending data from C server code to java client code将数据从 C 服务器代码发送到 java 客户端代码
【发布时间】:2014-04-21 09:47:54
【问题描述】:

我正在尝试编写一个简单的聊天应用程序,它的服务器用 C 编码,客户端用 Java 编码。我能够将数据从客户端发送到服务器,即 java 到 C,但是当我将数据从 C 中的服务器发送到 Java 中的客户端时遇到问题。这是两者的代码。 java中客户端代码的一部分

DataInputStream inDataStream;
    DataOutputStream outDataStream;
    String clientmessage;
    String ipaddress,servermessage="";
    System.out.print("Input the IP Address: ");
    DataInputStream dis=new DataInputStream(System.in);
    ipaddress=dis.readLine();
    Socket sock=new Socket(ipaddress,PORT);
    System.out.println("Server found..... ");
    do
    {
        System.out.print("Enter your message here: ");
        dis=new DataInputStream(System.in);
        clientmessage=dis.readLine();
        //outDataStream=new DataOutputStream(sock.getOutputStream());
        //outDataStream.writeUTF(clientmessage);
        PrintWriter out =new PrintWriter(sock.getOutputStream(), true);
        out.println(clientmessage+"\n");
        out.flush();
        BufferedReader input =new BufferedReader(new InputStreamReader(sock.getInputStream()));
        servermessage = input.readLine();
        System.out.println("Server's message: "+servermessage);
        //input.flush();
    }while(!servermessage.equals("bye"));
}
  }

C 中的部分服务器代码:

listen(listenfd, 10); 
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
do
{
    if ((num = recv(connfd, recvBuff, 1024,0))== -1) {
        perror("recv");
        exit(1);
    }
    //printf("bytes received = %d\n",num);
    //recvBuff[num]='\0';
    //printf("%d %d %d %d\n",recvBuff[0],recvBuff[1],recvBuff[2],recvBuff[3]);
    printf("Client's message: %s\n",recvBuff);
    printf("Enter your message here: ");
    scanf("%s",sendBuff);
    //printf("sending...... %s\n",sendBuff);
    strcat(sendBuff,"\n");
    if((send(connfd,sendBuff,strlen(sendBuff),0))==-1)
        {
            fprintf(stderr, "Failure Sending Message\n");
            close(connfd);
            exit(1);
        }
    //printf("sent...... %s\n",sendBuff);
}while(strcmp(sendBuff,"bye"));
close(connfd);
close(listenfd);
}

首先,客户端向服务器发送数据,服务器在 C 中完美接收。当 C 中的send() 向客户端发送数据时,它会逐字执行。例如,如果我发送“Hello People”,服务器首先发送“Hello”然后等待,直到那个时候客户端发送了另一条被服务器成功接收的消息。现在服务器不要求检查新字符串,而只是发送上一次的剩余数据,即 'People' 。

有人能指出哪里出错了吗? 提前致谢。

【问题讨论】:

  • 仔细阅读 recv()/send() 的手册页,并了解到这两个函数不一定接收/发送尽可能多的字节,但很少。因此,循环计算此类调用,直到所有预期的数据都已接收/发送是一个好主意,而不是说必要的必要性。
  • 虽然没有显示初始化套接字的代码,但我强烈怀疑是使用 raw 套接字。我相应地重新标记了这个问题。
  • 另请注意,您在 C 中的发送函数不会发送终止的空字节,因为 strlen 不计算在内。
  • "...用消息测试代码...":如果不实现自己的应用程序级协议,就没有消息,就像 TCP面向流。

标签: java c sockets network-programming


【解决方案1】:

除了普通的 read() / send() api 推荐,我怀疑你的问题是经典的 scanf

 scanf("%s",sendBuff);

因为你提到它第一次工作正常,第二次不等待输入。

使用类似的方法刷新输入缓冲区

 scanf("%s\n",sendBuff);

【讨论】:

    【解决方案2】:

    您的问题有点不清楚,但我认为您的问题是:您已将 C 程序中的数据写入内核,但内核尚未将其发送到网络然而。在 Linux 上,您可以运行 netstat -tope 来查看这些缓冲区中有多少数据。

    为什么没有发送?基本上是因为它试图累积一个最大大小的数据包并一次发送所有数据,而不是发送一系列小数据包。当你的程序从用户那里得到一些数据时,它会发送更多的数据。你还没有做任何事情来告诉内核立即发送。

    有几种相当复杂的算法可以控制这一点,最著名的是 Nagle 算法。

    简短的回答是您可能希望在套接字上设置TCP_NODELAY,它告诉内核立即发送而不是等待更多数据。

    或者,如果您在套接字上recv 会告诉内核您对对方的响应感兴趣,这将提示内核发送它当前拥有的内容。为了稳健起见,您可能希望服务器以任何方式确认消息,以便您可以判断连接是否已断开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多