Java和C ++之间的套接字通信

时间:2011-12-22 17:09:13

标签: java c++ sockets networking

我正在尝试在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 个答案:

答案 0 :(得分:2)

recv不会将其目标缓冲区转换为以null结尾的字符串。它在缓冲区中填充多个字节,但不附加0。

你需要做到这一点(当然是错误检查):

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

另外,请注意,recv不保证在一次通话中收到一次通话中发送的内容(除非您正在执行UDP)。

答案 1 :(得分:2)

您正在混合许多不同的编码转换和I / O策略。您应该尝试以下简化版本:

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不是默认代码页。在Windows中将Unicode数据输出到控制台需要一些其他库调用来配置。

答案 2 :(得分:0)

你只在这里为一个wchar_t分配空间:

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

您还将缓冲区分配给字符串s,但似乎永远不会使用s

答案 3 :(得分:0)

自昨晚以来,我一直有同样的问题。最后发现我的服务器无法识别编码(用C语言编写)。因此,我改变了我的客户

someOutputStream.writeUTF(someSillyString);

someOutputStream.write(someSillyString.getBytes());

这样,我甚至不需要在服务器端进行类型转换。