Java Socket Read在第二次读取时返回Strange Characters

时间:2017-08-01 11:26:29

标签: java c++ sockets

我有一个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个字符的字符数组,这些字符可能只包含比这更低的数量或问题是什么?

2 个答案:

答案 0 :(得分:0)

我认为你不应该以任何方式发送不必要的数据,所以在你的情况下只发送带有以下\0或更好的字符串,通常默认的方式是字节长度,之后是没有{{1的数据并且只读取一个字符串而不是一个完整的行。

例如,当读取整数作为数据大小时,也要注意字节顺序(litte或big endian)。

我确信有更多关于Java如何期望为套接字连接编码字符串的文档,或者您必须自己读取原始字节并将其转换为Java字符串。

答案 1 :(得分:0)

您正在读取行,即由\n\r\r\n终止的字符数据,如BufferedReader.readLine()所指定的那样,但您发送的内容不是行,它是以null结尾的C字符串。因此,在发件人关闭连接之前,您将不会收到任何内容,然后您将获得一个字符串,其中包含谁知道空值的位置。

您也没有对send()的结果进行错误检查。