繁体   English   中英

Java中的TCP客户端和C中的服务器

[英]TCP client in Java and server in C

我想提出一个聊天应用程序。 客户端将用Java编写,服务器将用C编写。在服务器端,消息将作为struct发送。 在客户端,我如何使用Java读取和分隔消息?

这是一个示例数据包结构:

struct s_packet{
 int   text_color;
 char  text[TEXTSIZE];
 char  alias[ALIASIZE];
};

这是一个示例服务器(C语言)发送功能:

send(iter->client.sockfd, (void *)se_packet, sizeof(s_packet), 0);

这是C语言中的示例客户端recv函数:

recv(m_sockfd, (void *)&se_packet, sizeof(s_packet),0);

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text);

我可以用C读取s_packet并分开,但是如何在Java中做到呢?

我如何在Java中这样分开:

printf("\x1b[3%dm <%s>: %s \x1b[0m\n", se_packet.text_color, se_packet.alias, se_packet.text);

肯定的答案是,这不会那么容易。 您应该了解的第一件事是tcp的工作方式。 这是一个面向流的协议 ,在tcp中没有“消息”之类的东西。 您只需发送和接收字节流。

在您的代码段中, recv可以在读取服务器发送的部分消息后完成。 相反,您应该在Java中保留一个本地缓冲区,并删除到目前为止已收到的所有数据。 在while循环中,您可以检测是否收到了准备处理的消息。 如果您的消息不是很大(小于MTU ),那么您可能会很幸运,并且始终会收到整个“消息”。 如果您对此不关心,则可以只使用java.io.InputStream.read(byte[])方法。

要考虑的另一件事是如何解释收到的消息。 好吧,您别无选择,只能在Java中将其作为byte []处理。 首先,您可能需要阅读s_packet.text_color 它可能会被放置为消息中的前4个字节。 您可以从thoes字节构造int(例如,参见将4个字节转换为int )。 但这不是一个好习惯。 这是因为您发送的二进制数据取决于s_packet 在内存中的表示方式 在现实生活中,您通常不知道int或char的大小是多少,它取决于平台。 有时int本身内部的字节顺序可以不同。 相反,您应该声明自己的序列化协议,以及如何将消息转换为二进制数据,反之亦然。 希望能帮助到你。

暂无
暂无

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

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