从Java-Client接收数据(数据包含int,short,string)

我正在寻找几个小时来得到关于我的问题的答案,但没有找到任何答案。 也许我在这里得到一些帮助。

我正在尝试做什么:Java-Client向C-Server发送消息。 该消息包含不同的类型,如整数,短和字符串(例如,message = int:total_msg_length; short:operation; string:hello – > total_msg-length = 4(整数的大小),operation = 2(short的大小) ,hello = 5(每个字母是1个字节= 5)。

那么,我如何在服务器中收到消息? 下面的代码接收一个Integer(工作正常)。 下一步将是接收短路然后接收一个字符串(以US-ASCII转换)。

int *msg; int recv_size; int final_msg; if( (recv_size = recv(client_socket, &msg, sizeof(msg), 0 )) < 0 ){ error_exit("Fehler bei recv(message_len)"); } final_msg = endian_swap(msg); printf("Message: %d\n", final_msg); return final_msg; 

有没有办法使用字节数组而不是char缓冲区? 我感谢每一个帮助。 请原谅我的英语不好,我来自德国:-)

您需要创建一个通用的“read_n_bytes”函数。

这可用于在三个连续调用中读取消息大小,操作和文本。

然后将这三个调用包装在一个函数中,以便调用它来读取整个消息。


通用阅读器可能如下所示:

 /* * Reads n bytes from sd into where p points to. * * returns 0 on succes or -1 on error. * * Note: * The function's name is inspired by and dedicated to "W. Richard Stevens" (RIP). */ int readn(int sd, void * p, size_t n) { size_t bytes_to_read = n; size_t bytes_read = 0; while (bytes_to_read > bytes_read) { ssize_t result = read(sd, p + bytes_read, bytes_to_read); if (-1 == result) { if ((EAGAIN == errno) || (EWOULDBLOCK == errno)) { continue; } # ifdef DEBUG { int errno_save = errno; perror("read() failed"); errno = errno_save; } # endif break; } else if(0 == result) { # ifdef DEBUG { int errno_save = errno; fprintf(stderr, "%s: Connection closed by peer.", __FUNCTION__); errno = errno_save; } # endif break; } bytes_to_read -= result; bytes_read += result; } return (bytes_read < bytes_to_read) ?-1 :0; }