我有一个C ++套接字服务器,它将JSON字符串发送到Java客户端。对于Java部分,我使用以下代码:
BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
while((inString = in.readLine()) != null) {
Log.i("JSON", inString);
C ++代码:
WSADATA wsa;
SOCKET s, new_socket;
struct sockaddr_in server, client;
int c;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { return false; }
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { return false; }
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(13377);
if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) { return false; }
listen(s, 3);
c = sizeof(struct sockaddr_in);
new_socket = accept(s, (struct sockaddr *)&client, &c);
if (new_socket == INVALID_SOCKET) { return false; }
while (listenSocket) {
if(...){
char sendData[] = "hallo";
send(new_socket, sendData, sizeof(sendData), NULL);
}
收到第一时间后,所有内容都按计划收到。但是,第二次只打印出方形“ ”中的问号。是因为我发送了一个包含2048个字符的字符数组,这些字符可能只包含比这更低的数量或问题是什么?
答案 0 :(得分:0)
我认为你不应该以任何方式发送不必要的数据,所以在你的情况下只发送带有以下\0
或更好的字符串,通常默认的方式是字节长度,之后是没有{{1的数据并且只读取一个字符串而不是一个完整的行。
例如,当读取整数作为数据大小时,也要注意字节顺序(litte或big endian)。
我确信有更多关于Java如何期望为套接字连接编码字符串的文档,或者您必须自己读取原始字节并将其转换为Java字符串。
答案 1 :(得分:0)
您正在读取行,即由\n
,\r
或\r\n
终止的字符数据,如BufferedReader.readLine()
所指定的那样,但您发送的内容不是行,它是以null结尾的C字符串。因此,在发件人关闭连接之前,您将不会收到任何内容,然后您将获得一个字符串,其中包含谁知道空值的位置。
您也没有对send()
的结果进行错误检查。