【发布时间】:2022-01-15 19:18:24
【问题描述】:
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客户端结果: encoding done with utf-8 python 应用程序抛出异常,因为它无法解码从套接字接收的数据: Python 3.9.5 我试图以不同的编码保存服务器,但我认为情况并非如此,可能需要对套接字声明进行一些更改。 客户端与服务器是同一台机器。 这是我的实际问题,要克服这个问题
【问题讨论】:
-
在问题中将错误消息显示为格式正确的文本,而不是图像或外部链接。
-
Python 错误:“D:\Python stuff\SimpleChatClient\Scripts\python.exe”“D:/Python stuff/SimpleChatClient/main.py”回溯(最近一次调用最后):文件“D :\Python stuff\SimpleChatClient\main.py", line 9, in
msg = msg.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe1 in position 3: invalid继续字节 b'abc\xe1\x00\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe' 进程以退出代码 1 结束 -
只是添加注释。最直接的原因是您的 C++ 代码正在使用此处看到的传统 Windows 默认编码:en.wikipedia.org/wiki/Windows-1252。该编码可能内置于 C++ 编译器本身。您会注意到,该编码中的
á字符是单字节十六进制e1(\xe1),它与您的 python 错误消息显示的内容相匹配。但e1不是有效 UTF-8 字符的一部分。以下@user16632363 的回答中的所有内容都是正确的:特别是在处理非 ascii 字符时,您必须明确编码。