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我试图用不同的编码保存服务器,但我认为情况并非如此,可能需要对套接字声明进行一些更改。客户端与服务器是同一台机器。这是我的实际问题,要克服这个问题
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的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如: