You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:02:43