当前位置: 首页 > 知识库问答 >
问题:

套接字编程,编码/解码数据/文本,通过套接字发送和接收更具体的特殊字符

甄阿苏
2023-03-14

Win 10 64位C服务器:

const int BufLen = 1024;
char RecvBuf[BufLen];
int result;
char SendBuf[BufLen] ;

const int PORT = 27015;
const char* HOST = "127.0.0.1";

int main()
{
    //SetConsoleOutputCP(65001);
    std::cout << "Hello World!\n";
    //std::cout << "á" << std::endl;
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);   if (iResult != NO_ERROR) {
        printf("Error at WSAStartup()\n");     
        return 1;
    }
    // Create a SOCKET for listening for   // incoming connection requests. 
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());    
        WSACleanup();  
        return 1;
    
    }
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.

    sockaddr_in service;

    service.sin_family = AF_INET;
    //service.sin_addr.s_addr = inet_addr("127.0.0.1");
    inet_pton(AF_INET, HOST, &service.sin_addr);
    service.sin_port = htons(PORT);

    if (bind(ListenSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) { 
        printf("bind() failed.\n"); 
        closesocket(ListenSocket); 
        WSACleanup(); 
        return 1;
    }
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) { 
        printf("Error listening on socket.\n");
        closesocket(ListenSocket); WSACleanup();
        return 1; 
    }

    // Create a SOCKET for accepting incoming requests. SOCKET AcceptSocket; printf("Waiting for client to connect...\n");
    SOCKET AcceptSocket;
    printf("Waiting for client to connect...\n");

    // Accept the connection.
    AcceptSocket = accept( ListenSocket, NULL, NULL );
    if (AcceptSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError()); 
        closesocket(ListenSocket);
        WSACleanup(); 
        return 1;
    }
    else printf("Client connected.\n");
    // Call the recvfrom function to receive datagrams 
    // on the bound socket.
    
    printf("Receiving datagrams...\n");
    result = recv(AcceptSocket, RecvBuf, BufLen, 0);
   
    printf("%d\n", result);
    std::cout << "Received:" << RecvBuf << std::endl;
    printf("%d", sizeof(RecvBuf));
    //strcpy_s(SendBuf, "Helloéáőúóü");
    printf("\n\n\n\n");
    strcpy_s(SendBuf, "abcá");
    std::cout << SendBuf << std::endl;
    result = send(AcceptSocket, SendBuf, BufLen, 0);
    printf("\nAfter sending: %d\n", result);
    std::cout << SendBuf;

Java客户端:

 var socket = new Socket("127.0.0.1", 27015);
        //sending to the server
        var out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Helloá");
        //receive from server
        var in = new InputStreamReader(socket.getInputStream());
        BufferedReader br = new BufferedReader(in);
        char[] buffer = new char[1024];
        int count = br.read(buffer, 0, 20);
        String reply = new String(buffer, 0, count);
        System.out.println(reply);

Python客户端:

HOST = "127.0.0.1"
PORT =  27015
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket.connect((HOST, PORT))
clientSocket.send("JAASFSKF".encode('utf-8'))
msg = clientSocket.recv(1024)
print(msg)
msg = msg.decode('utf-8')
print(msg)
clientSocket.close()

运行了一些特殊字符的实验,但客户端或服务器都无法处理它。

java客户端结果:使用utf-8完成编码,python应用程序抛出异常,因为它无法解码从socket:Python3.9接收的数据。5我试图用不同的编码保存服务器,但我认为情况并非如此,可能需要对套接字声明进行一些更改。客户端与服务器是同一台机器。这是我的实际问题,要克服这个问题

共有1个答案

萧明贤
2023-03-14

TCP套接字携带字节流而不进行解释。没有“特殊字符”。

你的C代码显然是在处理字节;Python和Java代码希望这些字节表示编码为UTF-8的“字符”。这是一种设计不匹配。

如果您的目的是通信使用UTF-8,则C代码应显式转换为UTF-8或从UTF-8转换。

此外,TCP中没有“消息”。这是一个字节streaam协议。您需要一个约定,以便每个终端可以确定它是否收到了应用程序希望作为消息的内容。

如果一方发送“xyz”(并且没有立即关闭连接),另一方如何知道“z”是最终字符?

由于您使用的是字符,一种方法是确保所有字符都以换行符“\n”结尾。您可以使用面向行的方法。

 类似资料:
  • 我有一个游戏,我正在用一些网络来制作多人游戏。我创建了一个自定义模块(在任何方面都不是最好的),将两个值(XY)从-1048576转换为1048576,一个值从0到60(健康),转换为6个字符。所以我可以用6个字节发送所有的信息。 但是这在Python 2中工作,在Python 3中,我发现我不能发送带有字符的“str”,所以我在发送之前使用了“. encode()”,在我的任何函数中使用“. d

  • 问题内容: 我正在尝试开发一个非常简单的客户端/服务器,其中客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 当前,程序仅创建一个空文件。我不是一个出色的Java开发人员,因此不胜感激。 这是接收客户端发送的内容的服务器部分。 这是客户端部分 问题答案: 在Java中复制流的正确方法如下: 希望我每次在论坛上发布时都能获得一美元。

  • 我试着做一个简单的服务器-客户机套接字通信,但服务器似乎无法正常工作。无论何时发送或接收,我都会收到此错误: 非插座上的插座操作:非插座上的插座操作 奇怪的是,这只会在服务器发送时出现。客户似乎还可以:

  • 我在网上搜索了很多,但是没有找到通过套接字发送对象并按原样接收的解决方案。我知道它需要酸洗,我已经做过了。将其转换为字节,然后从另一方面接收。但如何将这些字节转换为该类型的对象。 这是在客户端将对象转换为StringIO并发送到服务器的代码。在服务器端,我得到字节。现在我正在搜索要再次转换为StringIO的字节,以便获得对象值。 在代码中,对象被包装在StringIO中,并通过套接字发送。任何更

  • 问题内容: 我正在使用套接字连接我的Android应用程序(客户端)和Java后端服务器。每次与服务器通信时,我都希望从客户端发送两个数据变量。 1)某种消息(由用户通过界面定义) 2)消息的语言(由用户通过界面定义) 我该如何发送这些消息,以便服务器将每个消息解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论之后,我想向客户端返回一条消息。(我想我会没事的) 因此,我的两个问题是如

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如: