java c socket通信 中文乱码解决「建议收藏」

java c socket通信 中文乱码解决「建议收藏」前言 扯淡 作为一个一直从事 Java 的人来说 突然做 C 很多地方都是乱撞墙 就发送的这个乱码就让人感到十分头秃 昨天跟老板对话 老板说不行咱就花钱找别人做 能力别质疑的感觉真是让人糟心啊 不扯太多 程序员节快乐 大家一起头秃吧 虽然我并不想秃 问题 言归正传 c 接收信息是 gb2312 Java 发数据是 UTF 8 我 Java 接收数据没有问题 但是发给 C 就遇到乱码问题了

前言(扯淡)

作为一个一直从事Java的人来说,突然做C++很多地方都是乱撞墙,就发送的这个乱码就让人感到十分头秃,昨天跟老板对话,老板说不行咱就花钱找别人做。。。能力别质疑的感觉真是让人糟心啊- –

不扯太多,程序员节快乐,大家一起头秃吧。。虽然我并不想秃。

问题

言归正传,c++接收信息是gb2312,Java发数据是UTF-8,我Java接收数据没有问题,但是发给C++就遇到乱码问题了。此处可以参考博客:https://blog.csdn.net/weihongchang/article/details/17245223

不过我这样做在C++还是不能正确输出,后来一顿操作之后,把原先的输出方法printf换成了cout。。。结果就正确输出了。下面把发送程序和C++监听端口接收都发出来。

Java通过Socket发送数据:

    public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8090);
socket.getOutputStream().write("哈哈哈,My name is BeryAllen,迈克尔".getBytes("gb2312"));
socket.close();
}

C++接收数据:

#include 
#include
#include
#include "源文件.h"

using namespace std;

void ListenServer() {
WSADATA wsaData;
SOCKET sSerSock;
SOCKET sAccSock;
sockaddr_in serAddr;
sockaddr_in acc_sin;
int acc_sin_len;
int recv_len;
char szMsg[200];

if (WSAStartup(0x0101, &wsaData) != 0)
{
fprintf(stderr, "WSAStartup failed: %d\n", GetLastError());
return;
}

if ((sSerSock = ::socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
fprintf(stderr, "Socket() failed: %d\n", WSAGetLastError());
return;
}

serAddr.sin_family = AF_INET;
serAddr.sin_port = ::htons(8090);
serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (bind(sSerSock, (LPSOCKADDR)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
fprintf(stderr, "bind(sock) failed: %d\n", ::WSAGetLastError());
return;
}
//将socket由主动发送转为被动监听,当存在半连接时放入队列中,队列大小设置为20
if (listen(sSerSock, 20) != 0)
{
return;
}

acc_sin_len = sizeof(acc_sin);
while (1)
{

sAccSock = accept(sSerSock, (struct sockaddr*) & acc_sin, &acc_sin_len);
printf("接收套接字开始接收数据。。。。\n");

if (sAccSock < 0)
{
continue;
}
recv_len = recv(sAccSock, szMsg, strlen(szMsg), 0);
if (recv_len == SOCKET_ERROR)
{
continue;
}
else {

fprintf(stderr, "%d长度\n", recv_len);
/* recv_len 为接收数据的真实长度,此语句去除多余的无效字符。(在末尾加入字符串结束符号'\0')*/
szMsg[recv_len] = '\0';
string str(szMsg);
cout << str << endl;
}

if (recv_len == 0)
{
continue;
}
else
{
printf("本次数据接收结束。\n");
}
}

closesocket(sAccSock);
closesocket(sSerSock);
WSACleanup();
}
编程小号
上一篇 2025-03-26 22:51
下一篇 2025-02-22 12:11

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140937.html