TCP通讯 由于delphi的SOCKET组件在默认的情况下是没有被添加大组件库中的,如果你没有使用过SOCKET组件,在打开时就会提示TClientSocket或TServerSocket等控件没有被声明而不能编译通过; 解决办法: 添加组件草开发环境里面component->install package->add->"C:\Program Files\Borland\Delphi7\Bin\dclsockets70.bpl" 添加后在组件Internet页面可以看到TSocketClient和TSocketServer控件 客户端TSocketClient需要映射连接OnConnect、断开OnDisconnect及读取OnRead消息三个事件,服务器端TSocketServer也需要对应的映射监控是否有客户端连接上的OnClientConnect事件,客户端断开OnClientDisconnect事件及读取客户端数据的OnClientRead 服务器端TSocketServer只需提供客户端的连接端口ServerSocket.Port,然后打开ServerSocket.Open();就可以供客户端连接了;然后那三个事件就分别来处理连接时,断开时,及读取消息时的事件; procedure TForm1.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); 这里Socket就是连接上的套接字,通过它可以获取远程客户端IP及端口,分别是Socket.RemoteAddress和Socket.Port; procedure TForm1.OnClientDisconnect(Sender: TObject; procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket); 用该事件来接收客户端发来的数据,Socket.ReceiveText,是以字符串形式接收的,当然发送也是以字符串形式发送的CustomWinSocket[Socket].SendText(string);这里的CustomWinSocket就是定义的TCustomWinSocket类,当然在实际应用过程中接收和发送数据都要有一定的规范,所以要掌握一些字符串和数组,字节之间的转换。 我们使用TServerSocket组件来建立服务器端的程序。 它包含两个memo组件,用来分别处理接收到的数据和发送的数据,然后再在窗体上方一个TServerSocket组件,ServerType设置为stNonBlocking,Port设置为100,active设置为true,写几句简单的代码如下:
{
作者:wudi_1982 联系方式:wudi_1982@hotmail.com 转载请著名出处 } unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ScktComp; type TForm1 = class (TForm) ServerSocket1: TServerSocket; Memo1: TMemo; Button1: TButton; StatusBar1: TStatusBar; Memo2: TMemo; procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText : = ' connect ' ; end; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText : = ' disconnect ' ; end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.Lines.Add( Socket.ReceiveText); end; procedure TForm1.Button1Click(Sender: TObject); begin if ServerSocket1.Active then ServerSocket1.Socket.Connections[ 0 ].SendText(Memo2.Text); end; end. 然后编译程序。 客户端实现:
{
作者:wudi_1982 联系方式:wudi_1982@hotmail.com 转载请著名出处 } unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ScktComp; type TForm1 = class (TForm) ClientSocket1: TClientSocket; edIp: TEdit; Label1: TLabel; Label2: TLabel; edPort: TEdit; StatusBar1: TStatusBar; Memo1: TMemo; btnConnect: TButton; btnSent: TButton; btnDisconnect: TButton; Memo2: TMemo; procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure btnConnectClick(Sender: TObject); procedure btnDisconnectClick(Sender: TObject); procedure btnSentClick(Sender: TObject); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText : = ' 连接成功 ' ; end; procedure TForm1.btnConnectClick(Sender: TObject); begin if not ClientSocket1.Active then begin ClientSocket1.Host : = edIp.Text; ClientSocket1.Port : = StrToInt(edPort.Text); ClientSocket1.Open; (Sender as TButton).Enabled : = false ; btnDisconnect.Enabled : = true ; end; end; procedure TForm1.btnDisconnectClick(Sender: TObject); begin if ClientSocket1.Active then begin ClientSocket1.Close; btnDisconnect.Enabled : = false ; btnConnect.Enabled : = true ; end; end; procedure TForm1.btnSentClick(Sender: TObject); begin if ClientSocket1.Active then ClientSocket1.Socket.SendText(Memo1.Text) end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end; end |
delphi7 winsock
最新推荐文章于 2023-04-11 11:08:34 发布