热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Socket服务器程序接收中文数据时出现乱码问题分析及解决方案,客户端使用C#编写,返回中文数据可正常显示

在分析Socket服务器程序接收中文数据时出现的乱码问题时,我们发现客户端使用C#编写的数据在返回时能够正常显示。本文详细探讨了该问题的成因,并提出了一种有效的解决方案。通过调整字符编码设置和优化数据传输格式,确保了中文数据在传输过程中的完整性与正确性。具体实现代码包括对Socket读取事件的处理,确保数据以正确的编码格式进行解析和显示。
代码如下:
procedure TFrm_Main.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  p: pchar;
  lh: longint;
  Count, i: integer;
  ReceStr: string;
begin
  //p := nil;
  while Socket.ReceiveLength > 0 do
  begin
    lh := Socket.ReceiveLength;
    GetMem(p, lh);
    try
      Socket.ReceiveBuf(p^, Socket.ReceiveLength);
      ReceStr := StrPas(p);
      Memo_Log.Lines.Add(ReceStr);  //memo上显示的是乱码
      Count := SS.Socket.ActiveConnections;
      for i := 0 to Count - 1 do
      begin
        SS.Socket.Connections[i].SendBuf(p^, lh);//发出的数据在C#的窗体上                                                可以正常显示
      end;
    finally
      FreeMem(p);
    end;
  end;
end;

//s是不是PChar类型的问题呀??
谢谢了

7 个解决方案

#1


p: string;

GetMem(p, lh);改为:setlength(p,lh);
    try
      Socket.ReceiveBuf(p[0], Socket.ReceiveLength);

#2


不好使呀,又错误
Socket.ReceiveBuf(p[0], Socket.ReceiveLength);//这句又错误

#3


看一下这篇文章是否对你有帮助:
http://www.csdn.net/develop/article/19/19977.shtm

#4


Socket.ReceiveBuf(p[0], Socket.ReceiveLength);改为Socket.ReceiveBuf(p, Socket.ReceiveLength);

#5


呵呵,上面错了,这样更简单:

procedure TFrm_Main.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Count, i: integer;
begin
  //p := nil;
  while Socket.ReceiveLength > 0 do
  begin
    Memo_Log.Lines.Add(Socket.ReceiveText);        
    Count := SS.Socket.ActiveConnections;
    for i := 0 to Count - 1 do
    begin
      SS.Socket.Connections[i].SendBuf(Memo_Log.Lines[Memo_Log.Lines.Count-1], length(Memo_Log.Lines[Memo_Log.Lines.Count-1]));     
    end;
  end;
end;

#6


不要用不可靠的ReceiveLength.

缓冲区分配一个定长就行了.

#7


我的想法:
如果你的TClientSocket的ClientType是非阻塞式的(ctNonBlocking),
那么就用Socket.ReceiveText接收文本信息,比用Socket.ReceiveBuf安全一些。
同样发送文本信息用Socket.SendText而不是Socket.SendBuf

为什么使用ReceiveBuf接收文本信息不安全?
- ReceiveLength返回的值不是精确的
- GetMem(p, lh);使用GetMem为p分配的内存并没有初始化(以0填充),而PChar是以0结尾的,StrPas转化时有可能出现越界(超过p的实际范围)而产生乱码。

如果必须使用ReceiveBuf接收文本信息建议用AllocMem代替GetMem,同时保证为p分配的内存大于实际需要的大小,以保证接收到的文本是以0结尾的。

推荐阅读
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 本文深入探讨了CGLIB BeanCopier在Bean对象复制中的应用及其优化技巧。相较于Spring的BeanUtils和Apache的BeanUtils,CGLIB BeanCopier在性能上具有显著优势。通过详细分析其内部机制和使用场景,本文提供了多种优化方法,帮助开发者在实际项目中更高效地利用这一工具。此外,文章还讨论了CGLIB BeanCopier在复杂对象结构和大规模数据处理中的表现,为读者提供了实用的参考和建议。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 深入解析 Android TextView 中 getImeActionLabel() 方法的使用与代码示例 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 在托管C++中开发应用程序时,遇到了如何声明和操作字符串数组的问题。本文详细探讨了字符串数组在托管C++中的应用与实现方法,包括声明、初始化、遍历和常见操作技巧,为开发者提供了实用的参考和指导。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 优化后的标题:深入解析09版Jedis客户端
    深入解析09版Jedis客户端,本文将详细介绍如何在Java项目中正确配置Jedis以操作Redis。首先,确保项目的JDK版本和编译器设置正确。接着,通过Maven或Gradle导入必要的依赖项,如 `redis.clients:jedis`。此外,文章还将探讨Jedis连接池的配置与优化,以及常见问题的解决方案,帮助开发者高效使用Jedis进行Redis操作。 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
author-avatar
算错的账目
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有