Проблема кодирования TCP-связи между C # и Java - PullRequest
0 голосов
/ 22 февраля 2019

Я просто пытаюсь отправить значение int из моего приложения Android на мой сервер C #, но я что-то напутал, поскольку значения, полученные на сервере, невозможно преобразовать в int из-за проблем с кодировкой.

Android-приложение отправляет значение int (n):

OutputStream oos = new ObjectOutputStream(socket.getOutputStream());
int n = 1;
oos.write((""+n).getBytes());
oos.flush();

Мой сервер TCP C # читает:

byte[] message = new byte[4096];
int bytesRead=0;
bytesRead = clientStream.Read(message, 0, message.Length);
string dataReceived = System.Text.Encoding.ASCII.GetString(message);

dataReceived is "?? \0 \ u0005w \ u00011 \ 0 \ 0 ....... 0 \ 0 "

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы используете другую кодировку здесь.Java String.getBytes () по умолчанию использует Unicode UTF-16 и не может быть прочитан серверной стороной как ASCII.

Так что измените на

oos.write((""+n).getBytes("ISO-8859-1"));
0 голосов
/ 22 февраля 2019

Нет необходимости переносить OutputStream в ObjectOutputStream.

Java-клиент:

OutputStream oos = socket.getOutputStream();
int n = 1;
oos.write((""+n).getBytes());
oos.flush();

C # Сервер:

byte[] message = new byte[4096];
int bytesRead=0;
while (true)
{
    bytesRead = 0;
    try
    {
        bytesRead = clientStream.Read(message, 0, 4096);
    }
    catch
    {
        break;
    }

    if (bytesRead == 0)
    {
        break;
    }
    //message has successfully been received
    ASCIIEncoding encoder = new ASCIIEncoding();
    string msg = encoder.GetString(message, 0, bytesRead);
    if (!string.IsNullOrEmpty(msg.Replace("\r\n", "")))
    {
        int q = -1;
        if (int.TryParse(msg, out q))
        {
            queue.Enqueue(q);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...