当前位置: 首页 > news >正文

个人网站设计分类自动秒收录网

个人网站设计分类,自动秒收录网,48快装旧房翻新公司电话,苏州公司网站制作公司最近在使用UE的Socket模块与Python服务器进行通信时遇到了一些坑&#xff0c;特此记录一下。 先来复现一下问题&#xff0c;这里只截取关键代码。 UE端&#xff1a; bool ASoc::SendMsg(const FString& Msg) {TSharedRef<FInternetAddr> TargetAddr ISocketSubsy…

最近在使用UE的Socket模块与Python服务器进行通信时遇到了一些坑,特此记录一下。

先来复现一下问题,这里只截取关键代码。

UE端:

bool ASoc::SendMsg(const FString& Msg)
{TSharedRef<FInternetAddr> TargetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();FString Serialized = Msg;bool bSend;TCHAR* SeriallizedChar = Serialized.GetCharArray().GetData();int32 Size = FCString::Strlen(SeriallizedChar) + 1;int32 Sent = 0;bSend = SocClient->SendTo((uint8*)TCHAR_TO_UTF8(SeriallizedChar),Size,Sent,*TargetAddr);if(bSend){UE_LOG(LOGNLPFORUE,Log,TEXT("[To LTP | %d]: %s"),Size,*Msg);}else{UE_LOG(LOGNLPFORUE,Log,TEXT("Failed to send Msg to tlp"));}return bSend;
}

Python端:

def socrecv():global data,conn,addr,socwhile True:data = str(conn.recv(recvbuff),'utf-8','ignore')print('[recv msg from ue |',sys.getsizeof(data),']: ',repr(data))def soclisten():global soc,bind,conn,addr,recvthreadsoc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)soc.bind((ip,port))soc.listen(5)print('server listen...')bind = Truewhile True:conn,addr = soc.accept()print(addr,'已接入')recvthread = Thread(target=socrecv)recvthread.setDaemon(True)recvthread.start()   soclisten()

运行结果:

UE端发送的数据:

LOGNLPFORUE: [To LTP | 45]: {"cmd":"ltp","type":"cws","data":"他叫汤姆去拿外衣"}
LOGNLPFORUE: [To LTP | 102]: {"cmd":"ltp","type":"cws","data":"He told Tom to get the coat, but Tom brought a piece of underwear"}

Python端接收到数据:

[recv msg from ue | 148 ]:  '{"cmd":"ltp","type":"cws","data":"他叫汤'
[recv msg from ue | 151 ]:  '{"cmd":"ltp","type":"cws","data":"He told Tom to get the coat, but Tom brought a piece of underwear"}\x00'

可以看到数据容量并没有超出缓存上限,且Python端接收的数据都有做utf-8的编码转换,但依旧出现了中文数据接收不全,容量更大的英文数据反而没问题。

问题出在了UE端的FSocket::SendTo函数,SendTo函数的定义:

bool FSocket::SendTo(const uint8* Data, int32 Count, int32& BytesSent, const FInternetAddr& Destination)

Data就是我们要发送的字节数据,Count数据的大小,BytesSent记录的是数据的发送进度,Destination是要发送数据的地址。

问题就出在Count的值上,可以看到在上面的代码中我们是直接计算的FString的长度,然后以这个长度作为发送的数据大小,在纯英文的数据中这没有任何问题,但在中文数据中,由于中文编码的特殊性,FString应该有做特殊的编码处理,导致直接计算FString的长度作为发送数据的字节大小其实是小于真实数据大小的,这就导致在UE端发送中文数据时就没有发送完整到数据,所以Python端接收到数据就出现数据不全的问题。

既然知道原因了,接下来就可以解决了。那么我们就需要去找一个计算FString中文数据真实字节数的算法来计算SenTo要发送字节数据大小。

在网上我也没找到相关的算法代码,于是就去请教了一位大佬,大佬给了我一份算法代码:

int32 ASoc::CalcUtf0NumFromString(const FString& Str)
{int32 result = 0; for (int i = 0; i < Str.Len(); i++){if (Str[i] <= 0x7f)result = result + 1;else if (Str[i] > 0x7f && Str[i] <= 0x07ff)result = result + 2;else if (Str[i] > 0x07ff && Str[i] <= 0xffff)result = result + 3;elseresult = result + 4;}return result + 1;
}

没有去深究FString的中英文编码,代码我是没看明白的,使用这个算法计算数据的字节大小,就能计算出正确的大小。

然后UE端的代码将int32 Size = FCString::Strlen(SeriallizedChar) + 1;换成int32 Size = CalcUtf0NumFromString(SeriallizedChar);,问题就解决了。

http://www.hengruixuexiao.com/news/14362.html

相关文章:

  • 番禺网站建设优化推广宁波seo推广服务电话
  • 公司网站建设工作搜索引擎优化排名seo
  • 百度推广登录app软件下载站seo教程
  • 免费做计算机题的网站网络营销简介
  • 古风自己做头像的网站专业网络推广外包
  • 在上海做兼职去哪个网站搜索外贸建站平台
  • 甘肃兰州建筑网seo搜索引擎优化就业前景
  • 创建网站的向导和模板长尾词在线挖掘
  • 官方网站建设银行谷歌广告联盟一个月能赚多少
  • 什么软件做网站比较好网上推销产品的软件
  • 自己建设网站怎么做中国行业数据分析网
  • 怎么做自己的淘宝客推广网站找网站公司制作网站
  • f006网站建设网络营销有哪些就业岗位
  • 外贸商城网站建设公司郑州百度搜索优化
  • 政务网站无障碍建设友情链接网站大全
  • 有哪些网站能免费建站怎么查权重查询
  • 受欢迎的做pc端网站电脑培训班零基础网课
  • 北京国税局网站官网入口盘搜搜
  • 网站目录怎么做301重定向外贸网络营销
  • 怎么让别人访问我建的网站学电脑在哪里报名
  • 重庆网站托管服务最近一周新闻
  • 政府网站建设工作大会讲话北京seo百度推广
  • 没有域名可以先做网站吗seo外链优化培训
  • 建设部网站执业资格线下推广宣传方式有哪些
  • 石家庄网站制作哪家好网站之家
  • 深圳专业网站建设制作微信公众号营销
  • 成都网站建设哪里好前端性能优化
  • 常州seo网络推广成都外贸seo
  • 专门做茶叶会的音乐网站引流app推广软件
  • 做公司网站联系公司seo实战优化