Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 559|回复: 1

Delphi 使用socket和其他实体通信:

[复制链接]

254

主题

363

帖子

2431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2431
发表于 2024-12-13 04:50:19 | 显示全部楼层 |阅读模式
用任意语言编一个TCP的socket,然后Delphi与之通信:
  1. uses IdTCPClient;
  2. var TCPClient : TIdTCPClient;
  3.   procedure TForm1.sendAndReceive(conn: TIdTCPClient);
  4.     var
  5.       client_text, recvString: string;
  6.       buf: array[0..1023] of Char;
  7.       buffer: TBytes;
  8.       leng_of_msg : Longint;
  9.       bytes_length, bytes_body, raw_client_to_send: TBytes;
  10.     begin

  11.         try
  12.           client_text := '|CONSUMER|INIT|RaspiFreeLancer|RaspiCardBoard|1|';
  13.           memo1.Lines.Add('Will send:' + client_text);

  14.           leng_of_msg := length(client_text);
  15.           memo1.Lines.Add(inttostr(leng_of_msg));

  16.           bytes_length := longToBytes(leng_of_msg);

  17.           bytes_body := stringToBytes(client_text);

  18.           raw_client_to_send := combineTwoBytes(bytes_length, bytes_body);   // 都将两个字节组合到一块

  19.           if (conn.Connected) then  // and (TCPclient.Socket.Opened) then
  20.           begin
  21.             //TCPClient.IOHandler.(client_text, length(client_text)); // 发送数据到服务器

  22.             conn.IOHandler.WriteDirect(raw_client_to_send);

  23.           end;
  24.          
  25.           if (conn.Connected) and (not conn.Socket.InputBufferIsEmpty) then
  26.           begin

  27.             conn.IOHandler.CheckForDataOnSource(100);  // fill the output buffer with a timeout of 100ms.
  28.             conn.IOHandler.InputBuffer.ExtractToBytes(buffer, -1, True, -1);  // False???
  29.             memo2.Lines.Add('Has recved value:' + bytesToString(buffer));

  30.           end;
  31.           // recvString := TCPClient.IOHandler.ReadLn;    // 从服务器接收数据

  32.           // TCPClient.IOHandler.readln(buf, 1024);
  33.           // setLength(buffer, 100);
  34.           // TCPClient.IOHandler.ReadBytes(buffer,100,False); //   ReadBytes(buffer, 1024, True);

  35.           // memo1.Lines.add('Read from server:' + recvString); // 显示服务器响应
  36.         except

  37.           on e: exception do
  38.             memo1.Lines.add('Error:' + e.className + e.message);
  39.         end;
  40.     end;

  41.     function TForm1.combineTwoBytes(const bytes1, bytes2: TBytes): TBytes;
  42.     begin
  43.       setLength(result, length(bytes1) + length(bytes2));
  44.       copyMemory(@result[0], @bytes1[0], length(bytes1));
  45.       copyMemory(@result[length(bytes1)], @bytes2[0], length(bytes2));        
  46.     end;
复制代码
  1.   procedure TForm1.FormCreate(Sender: TObject);
  2.   begin
  3.     TCPClient := TIdTCPClient.Create(nil);
  4.     try

  5.       TCPClient.Host := '172.17.10.100'; // Python服务器的IP地址
  6.       TCPClient.Port := 65535;        // Python服务器监听的端口
  7.           //TCPClient.ConnectTimeout := 5000; // 连接超时时间
  8.           //TCPClient.ReadTimeout := 2000;    // 读取超时时间

  9.       TCPClient.Connect;               // 连接到服务器

  10.       //TCPClient.socket.open;

  11.       //sendAndReceive(TCPClient);

  12.     except
  13.       on e: Exception do
  14.          begin
  15.           TCPClient.Disconnect; // 断开连接
  16.           TCPClient.Free;
  17.           memo2.Lines.Add('Error conn:' + e.Message);
  18.          end;
  19.     end;
  20.   end;
复制代码


暂时就是这么编的,帧的前部是后部的长度,用一个长整型记录,之后两个部分都转成字节,然后相连接,发送。
收取的也是字节,转成字串输出。数据的转换请看前面一个帖子。
用到TIdTCPClient, Delphi2007 编译通过。

暂时这么编的。似乎有些时候不太稳定,欢迎大家批评。
回复

使用道具 举报

254

主题

363

帖子

2431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2431
 楼主| 发表于 2024-12-13 05:39:35 | 显示全部楼层
这里有一个从百度抄来的使用WinSock的例子,需要的可以参考delphi socket 通信
  1. program Project1;

  2. uses
  3.   SysUtils,
  4.   Winsock;

  5. var
  6.   sock: TSocket;
  7.   host: string;
  8.   servPort: Integer;
  9.   hostaddr: TSockAddrIn;
  10.   names: PHostEnt;
  11.   buf: array[0..1023] of Char;
  12.   name: string;
  13.   WSAData: TWSAData;
  14. begin
  15.   // 初始化Winsock
  16.   WSAStartup($202, WSAData);

  17.   // 设置服务器IP地址和端口
  18.   host := '127.0.0.1';
  19.   servPort := 12345;

  20.   // 创建socket
  21.   sock := socket(AF_INET, SOCK_STREAM, 0);

  22.   // 填写服务器地址结构
  23.   hostaddr.sin_family := AF_INET;
  24.   hostaddr.sin_port := htons(servPort);
  25.   names := gethostbyname(PChar(host));
  26.   move(names^.h_addr_list^, hostaddr.sin_addr.S_addr, names^.h_length);

  27.   // 连接服务器
  28.   connect(sock, hostaddr, sizeof(hostaddr));

  29.   // 接收数据
  30.   recv(sock, buf, 1024, 0);

  31.   // 打印接收到的数据
  32.   Writeln(buf);

  33.   // 关闭socket
  34.   closesocket(sock);

  35.   // 清理Winsock
  36.   WSACleanup;

  37.   readln;
  38. end.
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-16 04:49 , Processed in 0.014758 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表