如何从Delphi应用程序连接到Django WebSocket服务?
在Delphi中连接Django WebSocket服务的实现方案
一、使用Delphi内置TWebSocketClient(推荐,Delphi 10.2+)
Delphi从10.2 Tokyo版本开始内置了WebSocket客户端组件,无需额外依赖,直接就能实现连接。
1. 窗体组件准备
- 拖放
TWebSocketClient组件到窗体(命名为WebSocketClient1) - 添加一个
TButton(命名为btnConnect,用于触发连接) - 添加一个
TEdit(命名为edtMsg,输入要发送的消息) - 添加一个
TButton(命名为btnSend,发送消息) - 添加一个
TMemo(命名为memoLogs,记录连接状态和消息)
2. 核心代码实现
procedure TMainForm.btnConnectClick(Sender: TObject); begin try WebSocketClient1.URL := 'ws://127.0.0.1:8000/ws/ac/'; WebSocketClient1.Connect; memoLogs.Lines.Add('[状态] 正在尝试连接WebSocket服务'); except on E: Exception do memoLogs.Lines.Add('[错误] 连接失败: ' + E.Message); end; end; procedure TMainForm.WebSocketClient1Connected(Sender: TObject); begin memoLogs.Lines.Add('[状态] 已成功连接到Django WebSocket服务'); btnSend.Enabled := True; end; procedure TMainForm.WebSocketClient1Disconnected(Sender: TObject); begin memoLogs.Lines.Add('[状态] 与WebSocket服务断开连接'); btnSend.Enabled := False; end; procedure TMainForm.WebSocketClient1Receive(Sender: TObject; const AData: string); begin memoLogs.Lines.Add('[收到] ' + AData); end; procedure TMainForm.btnSendClick(Sender: TObject); begin if not WebSocketClient1.Connected then Exit; try WebSocketClient1.Send(edtMsg.Text); memoLogs.Lines.Add('[发送] ' + edtMsg.Text); edtMsg.Clear; except on E: Exception do memoLogs.Lines.Add('[错误] 发送消息失败: ' + E.Message); end; end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if WebSocketClient1.Connected then WebSocketClient1.Disconnect; end;
二、旧版Delphi(低于10.2):使用Indy组件
如果你的Delphi版本较早,可借助Indy的TIdWebSocketClient组件实现,步骤如下:
1. 准备工作
确保已安装Indy组件库,引用IdWebSocketClient、IdURI单元。
2. 核心代码示例
procedure TMainForm.btnIndyConnectClick(Sender: TObject); var WSClient: TIdWebSocketClient; RecvMsg: string; begin WSClient := TIdWebSocketClient.Create(nil); try WSClient.Host := '127.0.0.1'; WSClient.Port := 8000; WSClient.Path := '/ws/ac/'; try WSClient.Connect; memoLogs.Lines.Add('[状态] Indy客户端已连接'); // 发送测试消息 WSClient.Send('来自Delphi Indy的测试消息'); memoLogs.Lines.Add('[发送] 测试消息已发出'); // 接收服务端返回的消息(这里是同步接收,实际可改为异步) RecvMsg := WSClient.Recv; memoLogs.Lines.Add('[收到] ' + RecvMsg); WSClient.Disconnect; except on E: Exception do memoLogs.Lines.Add('[错误] Indy连接/通信失败: ' + E.Message); end; finally WSClient.Free; end; end;
三、关键注意事项
- 跨域配置:如果Delphi程序和Django服务不在同一主机,需要在Django Channels的配置中添加允许的Origin,避免跨域拦截。
- 异常处理:实际生产环境中,要增加对网络中断、服务端主动断开等场景的处理逻辑。
- 二进制消息:如果需要传输二进制数据,可使用
SendBinary方法和OnReceiveBinary事件(内置组件),或Indy对应的二进制传输接口。
内容的提问来源于stack exchange,提问作者I'mSRJ
相关产品推荐
相关产品推荐

