2016-09-11 5 views
1

;)C++ сервер и java клиентский чат

Я пишу чат-программу с сервером C++ и java-клиентом.

Код функции, которая отвечает за прием сообщений от клиента:

void *recieve(void* *v) 
{ 
    while (true) 
    { 
     bzero(buffer, 256); 
     n = read(socketfd, buffer, 256); 
     if (n < 0) 
      exit(1); 
     printf("Client: %s", buffer); 
    } 
} 

код функции Тар ответственного отправлять сообщения на сервер просто:

ps.println(msg); 

где ps - это печать.

Когда я отправляю сообщение серверу, скажите «привет мир» сервер C++ print: «Клиент: hello worldClient».

Буду признателен, если кто-то может мне помочь в этом. (Прошу прощения, если мой английский не очень хорошо) спасибо!

+0

Пробовал ли вы использовать запись и запись только числа прочитанных байтов? И, как сказал Йоахим, не забудьте нулевой завершающий байт. X) – Naliwe

+0

Кстати, вы пропустили важный случай в вашей проверке ошибок 'read': вы неправильно обрабатываете разъединения. –

+0

@JoachimPileborg не ['bzero()'] (http://man7.org/linux/man-pages/man3/bzero.3.html) гарантирует, что нулевой ограничитель будет там, если менее 256 байт получено ? – Christophe

ответ

2

Функция read() вернет 0, когда она дойдет до конца файла.

Итак, в вашем случае есть первая итерация цикла, которая принимает "Hello world", тогда есть еще одна итерация, которая ничего не получит, но read() возвращает 0. Таким образом, «Клиент:» отображается с пустой строкой.

Кроме того, следует помнить, что:

  • с гнездом на основе общения, это не гарантирует, что один read() на стороне сервера будет соответствовать одному println() на стороне клиента. Поэтому для более длинных сообщений вы рискуете получить их на куски. На выходе вы увидите несколько «клиентов» в тексте сообщения.
  • Отделившийся разделитель строк on the java side может не совпадать с ожидаемым на стороне сервера line separator, если вы работаете на кросс-платформенной платформе.
Смежные вопросы