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 <stdio.h>
#include <iostream>
#include <WINSOCK2.H>
#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 为接收数据的真实长度,此语句去除多余的无效字符。(在末尾加入字符串结束符号'
#include <stdio.h>
#include <iostream>
#include <WINSOCK2.H>
#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();
}
')*/ szMsg[recv_len] = '
#include <stdio.h>
#include <iostream>
#include <WINSOCK2.H>
#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();
}
'; string str(szMsg); cout << str << endl; } if (recv_len == 0) { continue; } else { printf("本次数据接收结束。\n"); } } closesocket(sAccSock); closesocket(sSerSock); WSACleanup(); }

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158372.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • qnap系统安装_snailsvn安装配置教程

    qnap系统安装_snailsvn安装配置教程QNAP安装subversion服务器背景安装1.安装Entware2.安装Subversion配置1.创建仓库2.配置仓库启动svn1.杀掉已有的svn进程2.启动)背景买了一台QNAPTS-453Bmini。是x86的机器,性能强大,最高能装16G内存。某日偶然网上发现有人做svn服务器,于是打算试试。为啥不用Gitlab呢。因为发现Container的网络ip…

    2022年10月17日
  • 浅谈一下学Java和python哪个好(个人观点)「建议收藏」

    浅谈一下学Java和python哪个好(个人观点)「建议收藏」其实这是一篇容易引起撕逼的文章,java是一种覆盖范围广,可跨平台的编程语言,python也是近几年火遍全世界的语言。先说结论,java是基础,另外一个是加分项,我仅代表我个人观点,为了祖国和谐,人民安康,请各位看官尽量理性讨论。java和python哪个好?很多朋友碰到了一个很共性的问题,那就是编程语言的选择。虽然Python这两年确实很火,但如果你的学历不是硕士以上,数学能力也一般,就无脑选java,不要选择Python作为就业方向。单单只会Python这门语言的是找不到工作的!Pyth

  • 数据库原理与应用基础(MySQL)_交互装置工作原理

    数据库原理与应用基础(MySQL)_交互装置工作原理MYSQL数据交互原理与性能问题分析

  • linux SIGABRT信号

    自己写的程序启动时偶尔会被SIGABRT信号杀死。故查看下SIGABRT的用法。SIGABRT是中止一个程序,它可以被捕捉,但不能被阻塞。处理函数返回后,所有打开的文件描述符将会被关闭,流也会被flush。程序会结束,有可能的话还会coredump。当程序调用abort(3)时,该进程会向自己发送SIGABRT信号。所以,SIGABRT一般用于信号中一些关键的处理,assert失败时也

  • AbstractMethodError那些事

    AbstractMethodError那些事Java社区添加小编微信进入java学习交流群,小编微信:372787553,备注进群AbstractMethodErrorExceptioninthread“main”java.lang.AbstractMethodError这样的异常并不常见,如果您有幸遇到了,那么一定要珍惜,否则转瞬即逝!发生原因为什么会发生这样的错误?让我们看一下官方的解释:当应用程序尝试调用抽象方法时抛出。通常,该错误被编译器捕获;如果某些类的定义自上次编译当前执行的方法以来不兼容地更改,则此错误只能

  • 快速生成数据库ER图的方式[通俗易懂]

    快速生成数据库ER图的方式[通俗易懂]dbdiagram简述快速简单的数据库模型设计工具,可以帮助您使用其自己的特定于域的语言(DSL)来绘制数据库图。最主要的是免费。dbdiagram地址https://dbdiagram.io/dbdiagram效果Draw.io简介对于基于Web的使用免费,对于Atlassian(Confluence/JIRA)应用则需要付费。特点Draw.io是一个免费的在线图表软件,用于制作流程图,流程图等。允许使用不同类型的图表,例如流程图,组织结构图,UML,ER和网络图。允许

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号