Сервер / клиент в Java и C / Objective - Проблемы кодирования - PullRequest
0 голосов
/ 05 февраля 2012

Я пытаюсь написать простой код для сервера / клиента.

Сервер (в java) ожидает строку от клиента:

ServerSocket ss = new ServerSocket(4001);
Socket s = ss.accept() ;

DataInputStream dataStreamIn = new DataInputStream(s.getInputStream()) ;

byte buffer[] = new byte[100];

dataStreamIn.read(buffer);


if((new String(buffer)).equals("1"))
    System.out.print("yes");//never printed

клиент (target-c)отправить строку на сервер:

uint8_t buffer[1000] ={0};
sprintf((char*)buffer,"%s", "1");

NSInteger wrote = [self.networkStreamOut 
                   write:buffer 
                   maxLength:(uint8_t)strlen((char *)buffer)];

Проблема в том, что буфер на сервере действительно равен "1", НО, когда я пытаюсь сравнить с .equals (), он возвращает false!

РЕДАКТИРОВАТЬ:

Когда я пытаюсь добавить на сервер эту строку:

System.out.println(Integer.valueOf(new String(buffer))) ;

Я получаю эту ошибку:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1

1 Ответ

1 голос
/ 05 февраля 2012

Вы должны явно указать, в какой кодировке вы ожидаете входящие данные, как на стороне клиента, так и на стороне сервера. Это особенно важно делать при взаимодействии между различными платформами / языками.

Но, конечно, проблема не в том, что ваша строка создается с кучей непечатных символов, потому что вы выделили ее для всего массива байтов:

byte[] buffer = new byte[100];
new String(buffer);

Предположительно, буфер не полностью заполнен после того, как вы прочитали в него данные, и значения по умолчанию в нем преобразуются в вашей строке в непечатаемые символы. Вы можете проверить это, напечатав длину строки, которую вы создали, вы найдете, что она больше 1.

У вас есть два средства - либо trim() String перед сравнением его значения, либо отслеживание количества прочитанных фактических байтов и создание нового байтового массива правильной длины (до создания вашей String).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...