Сокетная связь между Java и C ++ - PullRequest
4 голосов
/ 22 декабря 2011

Я пытаюсь установить соединение между сервером Java и клиентом C ++.Но когда я читаю данные в моем клиенте, у меня всегда появляется один и тот же странный символ (¬í).Я пытался изменить кодировку в обе стороны, но ничего не получалось.

Вот мой код Java:

public class Serveur
{
    public static void main(String[] args) throws Exception
    {
        final int PORT = 13370;
        try
        {
            ServerSocket service= new ServerSocket(PORT);
            Socket connection = service.accept();
            PrintWriter pw = new PrintWriter(connection.getOutputStream());
            String s = Integer.toString(5);
            while(true)
            {
                pw.print(s.getBytes("UTF-8"));
                pw.flush();
                pw.close();
            }
            connection.close();
        }
}

Я также пытался использовать OutputStream, DataOutputStream и BufferedOutputStream.

А вот код C ++:

int main(int argc, char* argv[])
{
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    char buffer[512];
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin.sin_family      = AF_INET;
    sin.sin_port        = htons(13370);
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
    cout<<"connection"<<endl;
    if(recv(sock, buffer, sizeof(buffer), 0) != SOCKET_ERROR)
    {
        string s = buffer;
        wchar_t *pwchello = L"Hi";
        wchar_t *pwc      = (wchar_t *)malloc( sizeof( wchar_t ));
        char    *pmbhello = buffer;
        int i = mbstowcs(pwc,pmbhello, MB_CUR_MAX);
        cout << i << endl;
        cout<<"cout : "<<pwc<<endl;
        cout <<buffer<<endl;
        printf("printf : %s\n", buffer);

        cout << "wsagetlasterror() : "<<WSAGetLastError();
        closesocket(sock);
        WSACleanup();
        free(m_pBuffer);
    }
    return 0;
}

Как видите, я пробовал другое решение, но безуспешно.

Заранее спасибо, и извините за мой английский, это можетбыть не очень хорошим

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Вы смешиваете множество различных кодировок и стратегий ввода-вывода. Вы должны попробовать следующую упрощенную версию:

if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
{
    cout << "connection" << endl;

    // the result of 'recv()' is either SOCKET_ERROR or
    // the number of bytes received.  don't though away
    // the return value.
    const int result = recv(sock, buffer, sizeof(buffer), 0);
    if(result != SOCKET_ERROR)
    {
        // use length (in bytes) returned by 'recv()'
        // since buffer is not null terminated.
        string s(buffer,result);

        // 's' is in UTF-8 no converstion to wide strings
        // should be necessary.
        cout << "message: '" << s << "'." << endl;
    }

    closesocket(sock);
}
WSACleanup();

Однако обратите внимание, что стандартный вывод находится в текущей кодовой странице, и обычно UTF-8 не является кодовой страницей по умолчанию. Для вывода данных Unicode на консоль в Windows требуется несколько других библиотечных вызовов для настройки.

2 голосов
/ 22 декабря 2011

recv не превращает свой целевой буфер в строку с нулевым символом в конце. Он заполняет количество байтов в буфере, но не добавляет 0.

Вам нужно это сделать сверху (с проверкой ошибок, конечно):

ssize_t bytesRead = recv(buffer, ...);
string str(buffer, bytesRead);

Также помните, что recv не гарантирует, что что-то, отправленное за один вызов, будет получено за один вызов (если вы не используете UDP).

0 голосов
/ 04 мая 2014

У меня такая же проблема с прошлой ночи.Наконец выяснил, что кодировка не распознается моим сервером (написано на С).Поэтому я изменил в моем клиенте

someOutputStream.writeUTF(someSillyString);

на

someOutputStream.write(someSillyString.getBytes());

Таким образом, мне даже не нужно было настраивать тип на стороне сервера.

0 голосов
/ 22 декабря 2011

Вы выделяете место только для одного wchar_t:

wchar_t *pwc = (wchar_t *)malloc( sizeof( wchar_t ));

Вы также назначаете буфер для строки s, но, кажется, никогда не используете s

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