2017-08-01 116 views
0

我有一个将JSON字符串发送到Java客户端的C++套接字服务器。对于Java部分我用下面的代码:Java Socket Read在第二次读取时返回奇怪字符

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个字符的char数组,它可能只包含比这个数量更少的数字,或者这个问题会是什么?

+0

请同时提供您的C++代码。 https://stackoverflow.com/help/mcve – Tezirg

回答

0

我想你不应该把不必要的数据无论哪种方式,所以在你的情况下,只有与发送字符串以下\0或更好,一般默认方式字节后,如果没有\0数据和只读单一长度字符串不是一个完整的行。

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

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

0

你正在阅读的线条,通过\n\r,或\r\n终止,为BufferedReader.readLine()规定即字符数据,但什么您是送是不是线,是空值终止的C字符串。因此,在发件人关闭连接之前,您将不会收到任何内容,然后您将收到一个字符串,其中包含哪些人知道空位的位置。

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

相关问题