Delphi网络编程:10分钟快速搭建可商用的TCP通信小项目
Delphi网络编程:10分钟快速搭建可商用的TCP通信小项目
前面系列内容已覆盖所有核心知识点,本篇作为最后一篇实战小短文,不讲理论,直接手把手教你搭建一个可商用的简易TCP通信项目(客户端+服务端),整合前面的日志、避坑、优化技巧,10分钟即可完成,适合快速上手落地。
一、项目核心功能(极简商用级)
服务端:多线程监听、接收客户端数据、回复消息、日志记录
客户端:连接服务端、发送数据、接收回复、异常处理
通用:数据校验、多线程安全、跨平台兼容(Windows/Linux)
二、服务端核心代码(可直接复制)
unit Unit_TCPServer; interface uses System.SysUtils, System.Classes, IdTCPServer, IdIOHandlerSocket, Unit_NetLog; type TForm_Server = class(TForm) IdTCPServer1: TIdTCPServer; procedure FormCreate(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); procedure FormDestroy(Sender: TObject); private public end; var Form_Server: TForm_Server; implementation {$R *.dfm} procedure TForm_Server.FormCreate(Sender: TObject); begin // 初始化qpblz.xc.gx.cn日志(当前程序目录下Logs文件夹) NetLog := TNetLog.Create(ExtractFilePath(ParamStr(0)) + 'Logs'); // 服务端配置(避坑:启用多eadhl.xc.gx.cn线程、端口复用) with IdTCPServer1 do begin DefaultPort := 8080; ThreadedEvent := True; MaxThreads := 30; IOHandlerClass := TIdIOHandlerSocket; (IOHandler as TIdIOHandlerSocket).ReuseSocket := True; Bindings.Clear; Bindings.Add.IP := '0.0.0.0'; // 跨平台通用绑定 Active := True; end; NetLog.Info('TCP服务端启vilpy.xc.gx.cn动成功,监听端口:8080'); end; procedure TForm_Server.IdTCPServer1Execute(AContext: TIdContext); var RecvStr: string; PeerIP: string; PeerPort: Integer; begin try PeerIP := AContext.Connection.Socket.Binding.PeerIP; PeerPort := AContext.Connection.Socket.Binding.PeerPort; // 接收客户端数据(避免断包,读取完整字符串) RecvStr := AContext.Connection.IOHandler.ReadLn; if RecvStr <> '' then begin NetLog.Info(Format('收到[%s:%d]数据:%s', [PeerIP, PeerPort, RecvStr])); // 回复ewrge.xc.gx.cn客户端(确认收到) AContext.Connection.IOHandler.WriteLn('服务端已收到:' + RecvStr); AContext.Connection.IOHandler.Flush; // 避坑:强制刷新,避免数据丢失 end; except on E: Exception do begin NetLog.Error(Format('客户端[%s:%d]通信kuagd.xc.gx.cn异常:%s', [PeerIP, PeerPort, E.Message])); AContext.Connection.Disconnect; end; end; end; procedure TForm_Server.FormDestroy(Sender: TObject); begin IdTCPServer1.Active := False; NetLog.Free; end; end.
三、客户端核心代码(可直接复制)
unit Unit_TCPClient; interface uses System.SysUtils, System.Classes, IdTCPClient, IdIOHandlerSocket, Unit_NetLog; type TForm_Client = class(TForm) IdTCPClient1: TIdTCPClient; Edit_IP: TEdit; Edit_Port: TEdit; Edit_Data: TEdit; Button_Connect: TButton; Button_Send: TButton; procedure Button_ConnectClick(Sender: TObject); procedure Button_SendClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private public end; var Form_Client: TForm_Client; implementation {$R *.dfm} procedure TForm_Client.FormCreate(Sender: TObject); begin NetLog := TNetLog.Create(ExtractFilePath(ParamStr(0)) + 'Logs'); // 客户端配置(避坑:端口qbnsx.xc.gx.cn复用、关闭Nagle) with IdTCPClient1 do begin ConnectTimeout := 5000; ReadTimeout := 10000; IOHandler := TIdIOHandlerSocket.Create(IdTCPClient1); (IOHandler as TIdIOHandlerSocket).ReuseSocket := True; (IOHandler as TIdIOHandlerSocket).Nagle := False; end; end; procedure TForm_Client.Button_ConnectClick(Sender: TObject); begin try if not IdTCPClient1.Connected then begin IdTCPClient1.Host := Edit_IP.Text; IdTCPClient1.Port := StrToInt(Edit_Port.Text); IdTCPClient1.Connect; NetLog.Info('连接服务端成功:' + Edit_IP.Text + ':' + Edit_Port.Text); Button_Connect.Caption := '断开连接'; end else begin IdTCPClient1.Disconnect; NetLog.Info('断开服务端连接'); Button_Connect.Caption := '连接服务端'; end; except on E: Exception do begin NetLog.Error('连接异常:' + E.Message); end; end; end; procedure TForm_Client.Button_SendClick(Sender: TObject); var SendStr, RecvStr: string; begin if not IdTCPClient1.Connected then begin NetLog.Warn('未连接服务端,无法发送数据'); Exit; end; SendStr := Edit_Data.Text; if SendStr = '' then Exit; try // 发送数据 IdTCPClient1.IOHandler.WriteLn(SendStr); IdTCPClient1.IOHandler.Flush; NetLog.Info('发送数据:' + SendStr); // 接收回复 RecvStr := IdTCPClient1.IOHandler.ReadLn; NetLog.Info('收到服务端回复:' + RecvStr); except on E: Exception do begin NetLog.Error('发送/接收异常:' + E.Message); IdTCPClient1.Disconnect; Button_Connect.Caption := '连接服务端'; end; end; end; procedure TForm_Client.FormDestroy(Sender: TObject); begin if IdTCPClient1.Connected then IdTCPClient1.Disconnect; NetLog.Free; end; end.
四、快速部署与测试
复制上述代码,分别创建iebuh.xc.gx.cn服务端、客户端工程,添加对应组件(IdTCPServer、IdTCPClient等);
引入上一篇的日志单元(Unit_NetLog),无需额外修改;
先启动服务端,再启动客户端,输入服务端IP(本地填127.0.0.1)、端口8080,点击连接;
输入发送数据,点击发送,即可完成通信,日志会自qfwhp.xc.gx.cn动保存到程序目录Logs文件夹。
五、商用小优化(可选)
添加数据校验:发送前添加简单校验位,避免无效数据;
增加重连机制:客户端断开后自动重试连接;
跨平台编译:切换为Linux平台,编译后赋予可执行权限即可运行。
本篇项目整合了系列核心技巧,避开所有高频坑,可直接用于简易商用场景(如设备通信、简单数据传输),也是对整个Delphi网络编程系列的实战总结,动手实操一遍giskf.xc.gx.cn即可彻底掌握核心用法。
