DELPHI高性能大容量SOCKET并发(六):协议字符集

Delphi集成DICOM影像:EZDICOM控件安装与实战指南 医学影像领域,DICOM(Digital Imaging and Communications in Medicine)是贯穿设备、存储与显示的核心标准。对于许多仍基于Delphi构建的医疗信息化系统,如何在成熟VCL架构里无缝嵌入DICOM文件的解析、显示与网络传输,往往成为项目落地的关键难点。EZDICOM作为一款专为Delphi设计的原生组件,以源码级集成方式降低了技术门槛,让开发者无需深入底层协议即可快速实现影像模块。从控件安装、图像渲染、标签读取到窗宽窗位调节与传输语法处理,本指南系统性梳理了从环 阅读详情

UTF-8

UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。

使用UTF-8的好处是现在一些手机平台都是使用UTF-8,另外在一些嵌入式平台,如果不支持中文,只支持英文,可以不转换,UTF-8就可以识别。

DELPHI默认支持的编码是ANSI,为了支持UTF-8,需要转换下,为了编程简便性,我们只在发包和解包的地方进行UTF-8转换。

发包:

function TBaseClientSocket.ControlCommand(const ACommand: string;
  ARequest, AResponse: TStrings; const AData: string): Boolean;
var
  slBuff: TStringList;
  dwPacketLen, dwCommandLen, dwCode: Cardinal;
  sBuff: string;
  utf8Command, utf8Data: UTF8String;
begin
  try
    slBuff := TStringList.Create;
    try
      FClient.ReadTimeout := FTimeOutMS;
      FClient.MaxLineLength := 1024 * 1024 * 1024;
      slBuff.Add('[' + CSRequest + ']');
      slBuff.Add(CSCommand + CSEqualSign + ACommand);
      if Assigned(ARequest) then
        slBuff.AddStrings(ARequest);
      sBuff := slBuff.Text;
      utf8Command := AnsiToUtf8(sBuff); //把ANSI转为UTF-8
      if not IsEmptyStr(AData) then
        utf8Data := AnsiToUtf8(AData); //把ANSI转为UTF-8
      dwPacketLen := SizeOf(Cardinal) + Length(utf8Command) + Length(utf8Data); //总长度
      dwCommandLen := Length(utf8Command); //命令长度
      FClient.WriteCardinal(dwPacketLen, False); //发送整个包长度
      FClient.WriteCardinal(dwCommandLen, False); //发送命令长度
      FClient.WriteBuffer(PUTF8String(utf8Command)^, dwCommandLen, True); //发送命令内容
      if not IsEmptyStr(AData) then
        FClient.WriteBuffer(PUTF8String(utf8Data)^, Length(utf8Data), True); //发送数据
      dwPacketLen := FClient.ReadCardinal(False); //读取整个包的长度
      dwCommandLen := FClient.ReadCardinal(False); //读取命令长度
      SetLength(utf8Command, dwPacketLen - SizeOf(Integer));
      FClient.ReadBuffer(PUTF8String(utf8Command)^, dwPacketLen - SizeOf(Integer)); //读取后续内容
      slBuff.Clear;
      slBuff.Text := Utf8ToAnsi(utf8Command); //转换为ANSI
      dwCode := Cardinal(StrToInt(slBuff.Values[CSCode]));
      Result := dwCode = 0;
      if not Result then
        FLastError := GetErrorCodeString(dwCode) + ': ' + slBuff.Values[CSMessage];
      if Assigned(AResponse) then
        AResponse.Text := slBuff.Text;
    finally
      slBuff.Free;
    end;
  except
    on E: Exception do
    begin
      FLastError := E.Message;
      Result := False;
    end;
  end;
end;
解包:

function TBaseSocket.DecodePacket(APacketData: PByte;
  const ALen: Integer): Boolean;
var
  CommandLen: Integer;
  UTF8Command: UTF8String;
begin
  if ALen > 4 then //命令长度为4字节,因而长度必须大于4
  begin
    CopyMemory(@CommandLen, APacketData, SizeOf(Cardinal)); //获取命令长度
    Inc(APacketData, SizeOf(Cardinal));
    SetLength(UTF8Command, CommandLen);
    CopyMemory(PUTF8String(UTF8Command), APacketData, CommandLen); //读取命令
    Inc(APacketData, CommandLen);
    FRequestData := APacketData; //数据
    FRequestDataLen := ALen - SizeOf(Cardinal) - CommandLen; //数据长度
    FRequest.Text := Utf8ToAnsi(UTF8Command); //把UTF8转为Ansi
    Result := True;
  end
  else
    Result := False; 
end;

这样好处就是外部编程接口就都是ANSI,和DELPHI保持一致,应用编写就可以不用注意这个细节。

V1版下载地址:http://download.youkuaiyun.com/detail/sqldebug_fan/4510076,需要资源10分,有稳定性问题,可以作为研究稳定性用;

V2版下载地址:http://download.youkuaiyun.com/detail/sqldebug_fan/5560185,不需要资源分,解决了稳定性问题和提高性能;免责声明:此代码只是为了演示IOCP编程,仅用于学习和研究,切勿用于商业用途。水平有限,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com
Delphi TCPIP通信 实例 解决中文乱码问题 敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的通信。因此,一个服务器端可以为多个客户端服务 立即下载

相关推荐

DELPHI高性能大容量SOCKET并发完成端口例子完整实例源码

Delphi高性能大容量SOCKET并发完成端口例子完整实例源码

一、delphi 开发的基于win socket文件传输系统(支持超4G文件,断点续传,多线程同时能传输100个文件以上,支持文件夹压缩传输)

delphi 自带的TIdFtpServer和TIdFtpClient组件,在实际应用中发现,只能单线程传输较小的文件。有很大局限性。决定自己写一个文件传输系统。该传输系统经测试,可以同时传输100个文件以上,超过4G大小的文件,支持断点续传。同时支持对文件夹的压缩传输。基本满足业务的要求。现在把服务器端和客户端代码粘贴如下: 一、服务器端 unit uTransFileSrv; inte...

byc6352的专栏 1207

Delphi TCPIP通信 实例 解决中文乱码问题 SOCKET SERVER-CLIENT

敝人近期整理的客户端与服务端通信实例,数据编码约定采用UTF-8编码,解决中文乱码问题.ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的通信。因此,一个服务器端可以为多个客户端服务

Delphi编写Socket聊天程序:打造高效稳定的即时通讯系统

以下是使用 Delphi 编写基于 Socket 的简单聊天程序的示例代码。在这个示例代码中,我们将创建一个基于 TCP 协议的服务器和客户端,客户端可以连接到服务器并发送和接收消息。当有客户端连接到服务器时,服务器将为每个客户端创建一个独立的线程来处理与客户端的通信。服务器可以接收客户端发送的消息,并将其广播给所有连接到服务器的客户端。需要注意的是,这只是一个简单的示例程序,实际开发中可能需要对程序进行优化和改进,以满足更高的性能和稳定性要求。当客户端接收到服务器发送的消息时,它将消息显示在消息框中。

Winfredzhang的博客 2000

IOCP(Delphi NET)C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码修改版

修改StartAccept接收管理错误信息,否则在实际应用中会出现的错误修改StartAccept接收管理错误信息,否则在实际应用中会出现的错误修改StartAccept接收管理错误信息,否则在实际应用中会出现的错误修改StartAccept接收管理错误信息,否则在实际应用中会出现的错误

QSPI Flash的原理与QSPI时序的Verilog实现

本节主要是讨论QSPI(Quad SPI,四线SPI总线)的相关内容。我的开发板上有一片型号是W25Q128BV的Quad SPI Flash存储器,本文将以它为例子来说明QSPI操作的一些内容。

Go Forward Forever! 4165

DELPHI高性能大容量SOCKET并发(七):通讯协议

协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,

SQLDebug_Fan的专栏 6730

Fast-LIO2轮速计融合实战:打滑检测与协方差调参避坑指南

多传感器融合是提升移动机器人定位鲁棒性的关键手段。在激光雷达与惯性测量单元(IMU)紧耦合的基础上,加入轮式编码器作为额外的速度约束,能够有效抑制长走廊、重复纹理等退化场景下的漂移。其核心原理是通过运动学模型将轮速转换为机体系速度,并作为因子引入迭代误差状态卡尔曼滤波器(ESIKF)。然而,打滑现象与协方差参数设置是融合成败的关键。本文从工程实践出发,系统梳理了传感器配置、外参标定、打滑检测策略(运动学一致性、轮速自洽性)以及观测噪声协方差R与初始协方差P0的调参方法,并给出实测参数与问题排查速查表,为在F

weixin_34159110的博客 433

delphi和 java通过socket通信的中文问题

delphi和 java通过socket通信的中文问题在delphi中把字符串转换下Msg:=Utf8Encode(Msg); java中接收java中用了minapublic static final String MSG_UTF = "UTF-8";     public static String decodeString(byte[] bytes) {   

风行天下 2765

168、OIS光学防抖系统设计:陀螺仪标定、音圈马达驱动与滚珠式/悬丝式结构选型

本文总结了OIS光学防抖系统设计中的关键问题与解决方案。作者通过实际案例指出,陀螺仪标定需重视零偏、灵敏度和温度补偿问题,音圈马达驱动需采用电流环控制并优化相位补偿。在机械结构选型方面,滚珠式适合大角度补偿但存在回差问题,悬丝式精度高但受重力影响,需根据应用场景选择。系统联调建议从开环到闭环逐步验证,注意陀螺仪与驱动频率匹配。最后给出5条经验建议:关注陀螺仪信噪比而非分辨率、预留标定余量、重视机械结构公差、配备专业调试工具、协调OIS与电子防抖的分工配合。文章强调OIS调试需针对不同模组特性进行反复测试与标

zzfmlxs的博客 43

如何在 SAP BTP 上通过 CDS view 快速创建 Fiori Elements 应用

本文基于 SAP Business Technology Platform 的 ABAP 编程环境进行的开发。 使用 ABAP Development Tool 登录 SAP BTP ABAP 编程环境,新建一个 package,命名为 Z_JERRY_CDS. 右键选中该 package,创建一个新的 Consumption view. 该视图是一个消费视图,它基于业务对象 (BO) 视图 /DMO/I_TRAVEL_U,提供了独立于消费层的给定数据模型。 它包含在其上运行的应用程序所需的所有核心信息。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2031

Delphi和JAVA用UTF-8编码进行Socket通信例子

最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码。 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收到是乱码,而我这边(Delphi7,ANSI)收到的数据将utf-8转码成ansi也是乱码。 因为不太熟悉java语言,还曾经怀疑是不是Delphi的utf-8编码和java语言的不一样。 最近...

weixin_34307464的博客 376

使用MiniExcel.SaveAsByTemplate快速地保存百万数据

该代码展示了如何使用MiniExcel快速生成并导出百万级销售数据。核心方法GenerateLargeData()可生成指定数量的随机销售记录,包含客户名、日期、VIP状态、积分等20个字段。通过随机函数模拟真实数据分布,并支持自定义数据量(默认100万条)。配合Excel模板使用MiniExcel.SaveAsByTemplate()方法,能高效地将大数据量导出为Excel文件,且处理速度极快。代码结构清晰,包含数据生成、随机日期辅助方法和数据模型类,适合需要批量生成测试数据或导出大型报表的场景。

大坡3D软件开发 253

Delphi中的XML-RPC库 不支持中文的解决方案

最近在网上看了一个帖子: 主题:   客户端用delphi写,服务器端用java写,这样的模式是否可行呢?其中用户 greateWei  的思路 提醒了我:使用 XML_RPC的方式 进行不同语言的交互。以前在某软件公司做过 JAVA => XML => HTTP  = >XML => DELPHI 的 系统,没有使用其他的技术,仅使用了 IDHTTP组件来获取XML。唯一的感觉就是构造过程比

tanminr的专栏 2668

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1824

SAP_PP模块定额工艺路线简介

在 SAP PP(生产计划)模块中,定额工艺路线(Routing) 是生产制造流程中的核心主数据之一,用于定义制造一个产品所需的标准操作步骤。工艺路线详细描述了生产过程中的各个工序、使用的工作中心、标准作业时间、资源分配等信息,是进行生产计划、成本核算、排产控制、车间执行等功能的基础。

我小时候很黑的博客 763

Delphi TCPIP通信 实例 —— 解决中文乱码问题 SOCKET SERVER-CLIENT

Delphi TCPIP通信 实例 —— 解决中文乱码问题 SOCKET SERVER-CLIENT 去发现同类优质开源项目:https://gitcode.com/ 在此提供的资源文件是一份详细记录了如何使用Delphi进行TCP/IP通信的实例教程。此实例专注于解决在网络通信过程中常见的中文乱码问题,采用UTF-8编码方式确保数据传输的正确性。 本实例涉及_server端与client端的构建...

gitblog_06770的博客 377

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 178

Delphi java 进程通信_(转载自IBM-DEV)java运用异步输入输出流编写Socket进程通信

杨健 (ytjcopy@263.net)中南工业大学代码号为”Merlin”的J2SE1.4带来了一些激动人心的新特性,诸如对正则表达式的支持,异步输入输出流,通道(Channel),字符集等.虽然该版本还处在测试阶段,但这些新特性早已让开发人员们跃跃欲试.在Merlin发布之前,异步输入输出流的应用还只是C,C++程序员的特殊武器;在Merlin中引入异步输入输出机制之后,Java程序员也可以利...

weixin_39927508的博客 145

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Delphi TCPIP通信 实例 —— 解决中文乱码问题

Delphi TCPIP通信 实例 —— 解决中文乱码问题 去发现同类优质开源项目:https://gitcode.com/ 本资源文件为近期整理的客户端与服务端通信实例,主要针对Delphi编程语言中的TCPIP通信。在实例中,我们采用了UTF-8编码方式,有效解决了中文乱码问题。 在这个通信实例中,ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求。每当有...

gitblog_06772的博客 530

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

socket通信乱码问题

用socket编写通信程序时,发现会出现乱码的情况,解决方法是InputStreamReader编码参数,windows选择UTF-8,mac选择GBK

随便玩玩 832

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

delphi连接mysql不用添加DSN(mysql connector odbc 5.1版)

一、下载安装mysql驱动http://mysql.com/downloads/connector/odbc/二、添加adoconnection,adoquery,使用以下连接字符串http://www.connectionstrings.com/mysql#p31adoconnection的属性ConnectionString填入以下所需要的连接情况对应字符串,在软件发布时,把mysql-con...

weixin_34007879的博客 171

c#调用delphi开发的webservice接口,中文返回值为乱码(一个汉字返回???),如何进行

c#调用delphi开发的webservice接口,中文返回值为乱码(一个汉字返回???),如何进行 <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="ht...

书写人生 2021

mysql dsn连接字符串_delphi连接mysql不用添加DSN(mysql connector odbc 5.1版)

一、下载安装mysql驱动http://mysql.com/downloads/connector/odbc/二、添加adoconnection,adoquery,使用以下连接字符串http://www.connectionstrings.com/mysql#p31adoconnection的属性ConnectionString填入以下所需要的连接情况对应字符串,在软件发布时,把mysql-con...

weixin_39969953的博客 190
上一篇: DELPHI高性能大容量SOCKET并发(五):锁和对象分离
下一篇: DELPHI高性能大容量SOCKET并发(七):通讯协议
SQLDebug_Fan
博客等级 码龄17年 710粉丝 26原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值