DELPHI TIdTCPClient,TIdTCPServer,SOCKET通讯小例子

SERVER:

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Sockets, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdTCPServer;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    IdTCPServer1: TIdTCPServer;
    Button2: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure Button2Click(Sender: TObject);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPServer1.DefaultPort:=167;
IdTCPServer1.Active:=True;
Memo1.Lines.Append('启动成功!');
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  str:string;
begin
  with AThread.Connection do
  begin
    str:=readln('',20);
    Memo1.Lines.Append('来自'+Socket.Binding.PeerIP+'的数据');
    Memo1.Lines.Append(str);
    WriteLn('数据接收成功');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Threads:TThreadList;
  LThreads:TList;
  i:integer;
  AThread: TIdPeerThread;
begin
  if IdTCPServer1.Active then
  begin
    Threads:=IdTCPServer1.Threads;
    if Assigned(Threads) then
    begin
      LThreads:=Threads.LockList;
      try
        for i:=0 to LThreads.Count-1 do
        begin
          AThread:=TIdPeerThread(LThreads[i]);
          AThread.Connection.WriteLn(Edit1.Text);
        end;
      finally
        Threads.UnlockList;
      end;
    end;
  end;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
  str:string;
begin
  str:=AThread.Connection.Socket.Binding.PeerIP;
  Memo1.Lines.Append(str+'连接成功!');
end;

end.
---------------------------------------------------------

CLIENT:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Sockets, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    Edit1: TEdit;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Host :='127.0.0.1';
IdTCPClient1.Port :=167;
IdTCPClient1.Connect();
Timer1.Enabled:=true;    //死在那里为什么,下面的 Timer1 事件里有解决方法,唯一的哦,嘿嘿
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
Memo1.Lines.Append('已连接');
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
Memo1.Lines.Append('已断开');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with IdTCPClient1 do
  begin
    try
      WriteLn(Edit1.Text);
      Memo1.Lines.Append(ReadLn());
    except
      Memo1.Lines.Append('发送数据失败');
    end;

  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  temp:string; 
begin
  IdTCPClient1.readfromstack(false,1,false);       //結案啦?那只好給大家自己去參考我的解決方案啦!這是IDTcpConnection的bug,解決方法如下~~~~
  while IdTCPClient1.InputBuffer.Size>0 do begin
     temp:=IdTCPClient1.ReadLn;
     Memo1.Lines.Append(temp);
  end;
end;

end.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种编程语言,支持使用socket进行网络通信。使用Delphi进行socket通信的过程可以分为以下几个步骤: 1. 导入相应的模块:在Delphi中,可以使用Indy(Internet Direct),这是一个功能强大的开源组件集。 2. 创建一个socket对象:使用TIdTCPClientTIdUDPServer类创建一个socket客户端或服务器端对象。 3. 配置socket参数:可以设置IP地址、端口号、超时时间等相关参数。 4. 建立连接:使用Connect方法连接到服务器,或者使用Bind方法绑定到指定的端口。 5. 发送数据:使用socket对象的Send方法发送数据给服务器端。 6. 接收数据:使用socket对象的ReceiveBuffer方法接收服务器端发来的数据。 7. 关闭连接:使用Disconnect方法断开与服务器的连接。 Delphi中的socket通信可以用于各种应用场景,比如实时聊天、文件传输等。在进行socket通信时,需要注意几点: 1. 异常处理:应当处理可能出现的异常情况,比如连接失败、发送或接收数据超时等。 2. 多线程:为避免UI线程阻塞,可以使用多线程来处理socket通信。 3. 数据编码:需要确保发送和接收的数据使用相同的编码格式,比如UTF-8。 总结而言,Delphi中的socket通信提供了一种方便快捷的方式来实现网络传输。通过使用相应的组件和方法,我们可以轻松地建立连接、发送和接收数据,并进行异常处理,实现功能强大的网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值