Я написал очень простой сервер C ++, к которому я подключаюсь из приложения Java. Сервер C ++ использует winsock2. Я отправляю номера в кодировке UTF8 на сервер от моего клиента, и после получения этих номеров я бы хотел, чтобы сервер выполнил действие. Однако мой сервер, кажется, получает серию цифр как один. На данный момент сервер прослушивает каждую 1 миллисекунду нового сообщения.
Это мой код сервера C ++, который получает сообщение:
bool receive()
{
char buffer[1024];
int inDataLength=recv(Socket,buffer,sizeof(buffer),0);
if(buffer[0] != '\0')
{
std::cout<<"Client: ";
std::cout << buffer;
sendKey(string(buffer));
}
else if (inDataLength == 0) //Properly closed connection
{
std::cout<<"Connection lost..\r\n";
return false;
}
return true;
}
Это вызывается внутри цикла следующим образом:
while ( receive() )
{
Sleep(1);
}
Это мой код Java-клиента, чтобы отправить сообщение, где находится OutputStream = socket.getOutputStream():
public void send(String msg)
{
try {
out.write( msg.getBytes("UTF8") );
out.flush();
Thread.sleep(100);
} catch (SocketException e) {
Global.error("Connection error..");
//e.printStackTrace();
} catch (UnsupportedEncodingException e) {
} catch (IOException e) {
Global.error("Never connected..\r\n");
} catch (Exception e)
{ Global.error("Sending failed..\r\n"); }
}
То, что я получаю, это то, что сервер получает, например, число 1, затем 2, затем 12, затем 121 и т. Д. Без какого-либо конкретного шаблона, за исключением того, что когда сервер получает 2 номера одновременно, он никогда не начнет получать только один раз. Это единственное место в моем Java-коде, где что-либо отправляется на сервер, и я очищаю буфер после каждого сообщения, так что я думаю, что проблема на моем сервере, но я в растерянности относительно этой проблемы.
Любая помощь приветствуется.
Благодарю.
Вы забыли самый важный чек:
int inDataLength=recv(Socket,buffer,sizeof(buffer),0);
if (inDataLength == -1 ) {
std::cerr << "receive error: " << GetLastError() << std::endl;
return false;
}
...
Это может быть причиной того, что ваш цикл занял так много процессорного времени.
Учитывая сна, кажется, что recv не блокирует .. Посмотрите на Winsock recv () не блокирует. Вам необходимо проверить наличие ошибок в возвращаемом значении.