【问题标题】:TCP client in Java and server in CJava中的TCP客户端和C中的服务器
【发布时间】:2017-04-09 02:12:50
【问题描述】:

我想做一个聊天应用程序。客户端用java编写,服务器用C编写。在服务器端,消息将作为结构发送。在客户端,如何使用 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);

【问题讨论】:

  • 不要使用结构体作为网络协议。使用网络协议作为网络协议。你从错误的地方开始。

标签: java c tcp client-server


【解决方案1】:

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

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

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

【讨论】:

  • 对于如何在 Java 中接收消息,您有很多选择。关于MTU和丢数据的部分看不懂。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2012-02-06
  • 2019-02-26
  • 2015-05-06
  • 2012-11-03
相关资源
最近更新 更多