【asp精品源码栏目提醒】:网学会员asp精品源码为您提供Delphi编写Socket通信程序 - 其它资料参考,解决您在Delphi编写Socket通信程序 - 其它资料学习中工作中的难题,参考学习。
Delphi 编写 Socket 通信程序TServerSocket 和 TClientSocket 两个组件的基本用法 ClientSocket 组件为客户端组件。
它是通信的请求方,也就是说,它是主动地与服务器端建立连接。
ServerSocket 组件为服务器端组件。
它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请求,并对请求进行回复。
ServerSocket 组件可以同时接受一个或多个 ClientSocket 组件的连接请求,并与每个ClientSocket 组件建立单独的连接,进行单独的通信。
因此,一个服务器端可以为多个客户端服务。
设计思路 本例包括一个服务器端程序和一个客户端程序。
客户端程序可以放到多个计算机上运行,同时与服务器端进行连接通信。
本例的重点,一是演示客户端与服务器端如何通信;二是当有多个客户端同时连接到服务器端时,服务器端如何识别每个客户端,并对请求给出相应的回复。
为了保证一个客户端断开连接时不影响其它客户端与服务器端的通信,同时保证服务器端能够正确回复客户端的请求,在本例中声明了一个记录类型:type client_recordrecord CHandle: integer //客户端套接字句柄 CSocket:TCustomWinSocket //客户端套接字 CName:string //客户端计算机名称 CAddress:string //客户端计算机 IP 地址 CUsed: boolean //客户端联机标志end 利用这个记录类型数据保存客户端的信息,同时保存当前客户端的连接状态。
其中,CHandle 保存客户端套接字句柄,以便准确定位每个与服务器端保持连接的客户端;Csocket 保存客户端套接字,通过它可以对客户端进行回复。
Cused 记录当前客户端是否与服务器端保持连接。
下面对组件 ServerSocket 和 ClientSocket 的属性设置简单说明。
ServerSocket 的属性: Port,是通信的端口,必须设置。
在本例中设置为 1025; ServerTypt,服务器端读写信息类型,设置为 stNonBlocking 表示异步读写信息,本例中采用这种方式。
ThreadCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。
本例采用默认值 10。
其它属性采用默认设置即可。
ClientSocket 的属性: Port,是通信的端口,必须与服务器端的设置相同。
在本例中设置为 1025; ClientType,客户端读写信息类型,应该与服务器端的设置相同,为 stNonBlocking表示异步读写信息。
Host,客户端要连接的服务器的 IP 地址。
必须设置,当然也可以在代码中动态设置。
其它属性采用默认设置即可。
: 服务器端源码(uServerMain.pas)unit uServerMaininterface uses Windows Messages SysUtils Classes Graphics Controls Forms Dialogs ScktComp ToolWin ComCtrls ExtCtrls StdCtrls Buttons const CMax10 //客户端最大连接数 type client_recordrecord CHandle: integer //客户端套接字句柄 CSocket:TCustomWinSocket //客户端套接字 CName:string //客户端计算机名称 CAddress:string //客户端计算机 IP 地址 CUsed: boolean //客户端联机标志 end type TfrmServerMain classTForm ServerSocket: TServerSocket ControlBar1: TControlBar ToolBar1: TToolBar tbConnect: TToolButton tbClose: TToolButton tbDisconnected: TToolButton Edit1: TEdit Memo1: TMemo StatusBar: TStatusBar procedure tbConnectClickSender: TObject procedure tbDisconnectedClickSender: TObject procedure ServerSocketClientReadSender: TObjectSocket: TCustomWinSocket procedure ServerSocketListenSender: TObjectSocket: TCustomWinSocket procedure ServerSocketClientConnectSender: TObjectSocket: TCustomWinSocket procedure ServerSocketClientDisconnectSender: TObjectSocket: TCustomWinSocket procedure tbCloseClickSender: TObject procedure FormCreateSender: TObject procedure FormCloseSender: TObject var Action: TCloseAction procedure ServerSocketGetSocketSender: TObject Socket: Integer var ClientSocket: TServerClientWinSocket procedure ServerSocketClientErrorSender: TObject Socket: TCustomWinSocket ErrorEvent: TErrorEvent var ErrorCode: Integer private Private declarations public Public declarations session: array0..CMax of client_record //客户端连接数组 Sessions: integer //客户端连接数endvar frmServerMain: TfrmServerMain implementation R .DFM //打开套接字连接,并使套接字进入监听状态 procedure TfrmServerMain.tbConnectClickSender: TObjectbegin ServerSocket.Open end//关闭套接字连接,不再监听客户端的请求procedure TfrmServerMain.tbDisconnectedClickSender: TObjectbegin ServerSocket.Close StatusBar.Panels0.Text :服务器套接字连接已经关闭,无法接受客户端的连接请求.end//从客户端读取信息procedure TfrmServerMain.ServerSocketClientReadSender: TObjectSocket: TCustomWinSocketvar i:integerbegin //将从客户端读取的信息添加到 Memo1 中 Memo1.Lines.AddSocket.ReceiveText for i:0 to sessions do begin //取得匹配的客户端 if sessioni.CHandle Socket.SocketHandle then begin sessioni.CSocket.SendText回复客户端sessioni.CAddress Edit1.Text end endend//服务器端套接字进入监听状态,以便监听客户端的连接procedure TfrmServerMain.ServerSocketListenSender: TObjectSocket: TCustomWinSocket begin StatusBar.Panels0.Text :等待客户端连接... end //当客户端连接到服务器端以后 procedure TfrmServerMain.ServerSocketClientConnectSender: TObjectSocket: TCustomWinSocket var ij:integer begin j:-1 for i:0 to sessions do begin //在原有的客户端连接数组中有中断的客户端连接 if not sessioni.CUsed then begin sessioni.CHandle : Socket.SocketHandle //客户端套接字句柄 sessioni.CSocket : Socket //客户端套接字 sessioni.CName : Socket.RemoteHost //客户端计算机名称 sessioni.CAddress : Socket.RemoteAddress //客户端计算机 IP sessioni.CUsed : True //连接数组当前位置已经占用 Break end j:i end if jsessions then begin incsessions sessionj.CHandle : Socket.SocketHandle sessionj.CSocket : Socket sessionj.CName : Socket.RemoteHost sessionj.CAddress : Socket.RemoteAddress sessionj.CUsed : True end StatusBar.Panels0.Text : 客户端 Socket.RemoteHost 已经连接end//当客户端断开连接时procedure TfrmServerMain.ServerSocketClientDisconnectSender: TObjectSocket: TCustomWinSocketvar i:integerbegin for i:0 to sessions do begin if sessioni.CHandle Socket.SocketHandle then begin sessioni.CHandle :0 sessioni.CUsed : False Break end end StatusBar.Panels0.Text :客户端 Socket.RemoteHost 已经断开end//关闭窗口procedure TfrmServerMain.tbCloseClickSender: TObjectbegin Closeendprocedure TfrmServerMain.FormCreateSender: TObjectbegin sessions : 0endprocedure TfrmServerMain.FormClose
上一篇:
留言板与公告板
下一篇:
基于消费者社会化视角的儿童消费者影响因素研究