知识大全 利用Delphi编写Socket通信程序

Posted 通信

篇首语:过去并不等于未来,一定会有辉煌的一天,相信自己!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用Delphi编写Socket通信程序相关的知识,希望对你有一定的参考价值。

利用Delphi编写Socket通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

笔者在工作中遇到对局域网中各工作站与服务器之间进行Socket通信的问题 现在将本人总结出来的TServerSocket和TClientSocket两个组件的基本用法写出来 希望与您分享   ClientSocket组件为客户端组件 它是通信的请求方 也就是说 它是主动地与服务器端建立连接   ServerSocket组件为服务器端组件 它是通信的响应方 也就是说 它的动作是监听以及被动接受客户端的连接请求 并对请求进行回复   ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求 并与每个ClientSocket组件建立单独的连接 进行单独的通信 因此 一个服务器端可以为多个客户端服务 一 设计思路   本例包括一个服务器端程序和一个客户端程序 客户端程序可以放到多个计算机上运行 同时与服务器端进行连接通信   本例的重点 一是演示客户端与服务器端如何通信 二是当有多个客户端同时连接到服务器端时 服务器端如何识别每个客户端 并对请求给出相应的回复 为了保证一个客户端断开连接时不影响其它客户端与服务器端的通信 同时保证服务器端能够正确回复客户端的请求 在本例中声明了一个记录类型 type client_record=record CHandle: integer; //客户端套接字句柄 CSocket:TCustomWinSocket; //客户端套接字 CName:string; //客户端计算机名称 CAddress:string; //客户端计算机IP地址 CUsed: boolean; //客户端联机标志 end;   利用这个记录类型数据保存客户端的信息 同时保存当前客户端的连接状态 其中 CHandle保存客户端套接字句柄 以便准确定位每个与服务器端保持连接的客户端 Csocket保存客户端套接字 通过它可以对客户端进行回复 Cused记录当前客户端是否与服务器端保持连接 二 属性设置  下面对组件ServerSocket和ClientSocket的属性设置简单说明 1 ServerSocket的属性 · Port 是通信的端口 必须设置 在本例中设置为 · ServerTypt 服务器端读写信息类型 设置为stNonBlocking表示异步读写信息 本例中采用这种方式 · ThreadCacheSize 客户端的最大连接数 就是服务器端最多允许多少客户端同时连接 本例采用默认值   其它属性采用默认设置即可 2 ClientSocket的属性 · Port 是通信的端口 必须与服务器端的设置相同 在本例中设置为 · ClientType 客户端读写信息类型 应该与服务器端的设置相同 为stNonBlocking表示异步读写信息 · Host 客户端要连接的服务器的IP地址 必须设置 当然也可以在代码中动态设置   其它属性采用默认设置即可 三 程序源代码1 服务器端源码(uServerMain pas) unit uServerMain; interface uses Windows Messages SysUtils Classes Graphics Controls Forms Dialogs ScktComp ToolWin ComCtrls ExtCtrls StdCtrls Buttons; const CMax= ; //客户端最大连接数 type client_record=record CHandle: integer; //客户端套接字句柄 CSocket:TCustomWinSocket; //客户端套接字 CName:string; //客户端计算机名称 CAddress:string; //客户端计算机IP地址 CUsed: boolean; //客户端联机标志 end; type TfrmServerMain = class(TForm) ServerSocket: TServerSocket; ControlBar : TControlBar; ToolBar : TToolBar; tbConnect: TToolButton; tbClose: TToolButton; tbDisconnected: TToolButton; Edit : TEdit; Memo : TMemo; StatusBar: TStatusBar; procedure tbConnectClick(Sender: TObject); procedure tbDisconnectedClick(Sender: TObject); procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketListen(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure tbCloseClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer; var ClientSocket: TServerClientWinSocket); procedure ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); private Private declarations public Public declarations session: array[ CMax] of client_record; //客户端连接数组 Sessions: integer; //客户端连接数 end; var frmServerMain: TfrmServerMain; implementation $R * DFM //打开套接字连接 并使套接字进入监听状态 procedure TfrmServerMain tbConnectClick(Sender: TObject); begin ServerSocket Open ; end; //关闭套接字连接 不再监听客户端的请求 procedure TfrmServerMain tbDisconnectedClick(Sender: TObject); begin ServerSocket Close; StatusBar Panels[ ] Text := 服务器套接字连接已经关闭 无法接受客户端的连接请求 ; end; //从客户端读取信息 procedure TfrmServerMain ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); var i:integer; begin //将从客户端读取的信息添加到Memo 中 Memo Lines Add(Socket ReceiveText); for i:= to sessions do begin //取得匹配的客户端 if session[i] CHandle = Socket SocketHandle then begin session[i] CSocket SendText( 回复客户端 +session[i] CAddress+ ==> +Edit Text); end; end; end; //服务器端套接字进入监听状态 以便监听客户端的连接 procedure TfrmServerMain ServerSocketListen(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar Panels[ ] Text := 等待客户端连接 ; end; //当客户端连接到服务器端以后 procedure TfrmServerMain ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket); var i j:integer; begin j:= ; for i:= to sessions do begin //在原有的客户端连接数组中有中断的客户端连接 if not session[i] CUsed then begin session[i] CHandle := Socket SocketHandle ;//客户端套接字句柄 session[i] CSocket := Socket; //客户端套接字 session[i] CName := Socket RemoteHost ; //客户端计算机名称 session[i] CAddress := Socket RemoteAddress ;//客户端计算机IP session[i] CUsed := True; //连接数组当前位置已经占用 Break; end; j:=i; end; if j=sessions then begin inc(sessions); session[j] CHandle := Socket SocketHandle ; session[j] CSocket := Socket; session[j] CName := Socket RemoteHost ; session[j] CAddress := Socket RemoteAddress ; session[j] CUsed := True; end; StatusBar Panels[ ] Text := 客户端 +Socket RemoteHost + 已经连接 ; end; //当客户端断开连接时 procedure TfrmServerMain ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); var i:integer; begin for i:= to sessions do begin if session[i] CHandle =Socket SocketHandle then begin session[i] CHandle := ; session[i] CUsed := False; Break; end; end; StatusBar Panels[ ] Text := 客户端 +Socket RemoteHost + 已经断开 ; end; //关闭窗口 procedure TfrmServerMain tbCloseClick(Sender: TObject); begin Close; end; procedure TfrmServerMain FormCreate(Sender: TObject); begin sessions := ; end; procedure TfrmServerMain FormClose(Sender: TObject; var Action: TCloseAction); begin ServerSocket Close ; end; //当客户端正在与服务器端连接时 procedure TfrmServerMain ServerSocketGetSocket(Sender: TObject; Socket: Integer; var ClientSocket: TServerClientWinSocket); begin StatusBar Panels[ ] Text := 客户端正在连接 ; end; //客户端发生错误 procedure TfrmServerMain ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin StatusBar Panels[ ] Text := 客户端 +Socket RemoteHost + 发生错误! ; ErrorCode := ; end; end 2 客户端源码(uClientMain pas) unit uClientMain; interface uses Windows Messages SysUtils Classes Graphics Controls Forms Dialogs ScktComp ComCtrls ToolWin ExtCtrls StdCtrls Buttons; const SocketHost = ; //服务器端地址 type TfrmClientMain = class(TForm) ControlBar : TControlBar; ToolBar : TToolBar; tbConnected: TToolButton; tbSend: TToolButton; tbClose: TToolButton; tbDisconnected: TToolButton; ClientSocket: TClientSocket; Edit : TEdit; Memo : TMemo; StatusBar: TStatusBar; btnSend: TBitBtn; procedure tbConnectedClick(Sender: TObject); procedure tbDisconnectedClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); procedure tbSendClick(Sender: TObject); procedure tbCloseClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); private Private declarations public Public declarations end; var frmClientMain: TfrmClientMain; implementation $R * DFM //打开套接字连接 procedure TfrmClientMain tbConnectedClick(Sender: TObject); begin ClientSocket Open ; end; //关闭套接字连接 procedure TfrmClientMain tbDisconnectedClick(Sender: TObject); begin ClientSocket Close; end; //接受服务器端的回复 procedure TfrmClientMain ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo Lines Add(Socket ReceiveText); end; //发送信息到服务器端 procedure TfrmClientMain tbSendClick(Sender: TObject); begin ClientSocket Socket SendText(Edit Text); end; procedure TfrmClientMain tbCloseClick(Sender: TObject); begin Close; end; //设置要连接的服务器端地址 procedure TfrmClientMain FormShow(Sender: TObject); begin ClientSocket Host := SocketHost; end; //已经连接到服务器端 procedure TfrmClientMain ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin tbSend Enabled := True; tbDisconnected Enabled :=True; btnSend Enabled := True; StatusBar Panels[ ] Text := 已经连接到 + Socket RemoteHost ; end; //正在连接到服务器端 procedure TfrmClientMain ClientSocketConnecting(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar Panels[ ] Text := 正在连接到服务器 ; end; //当断开与服务器端的连接时发生 procedure TfrmClientMain ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin tbSend Enabled := False; btnSend Enabled := False; tbDisconnected Enabled := False; StatusBar Panels[ ] Text := 已经断开与 + Socket RemoteHost + 的连接 ; end; procedure TfrmClientMain FormClose(Sender: TObject; var Action: TCloseAction); begin ClientSocket Close ; end; //当与服务器端的连接发生错误时 procedure TfrmClientMain ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin StatusBar Panels[ ] Text := 与服务器端的连接发生错误 ; ErrorCode := ; end; end 四 小结   上述方法是比较简单的实现方法 同时也是相对较容易理解的方法 通过这个方法 笔者成功实现了局域网内多个客户端与服务器端进行Socket通信的功能 同时可以保证一个客户端的连接 通信或是断开都不影响其它客户端的正常通信 五 附录  服务器端窗体和客户端窗体及组件的属性设置队应的DFM文件 uServerMain pas对应的DFM文件(uServerMain dfm) object frmServerMain: TfrmServerMain Left = Top = BorderIcons = [biSystemMenu biMinimize] BorderStyle = bsSingle Caption = ServerSocket ClientHeight = ClientWidth = Color = clBtnFace Font Charset = DEFAULT_CHARSET Font Color = clWindowText Font Height = Font Name = MS Sans Serif Font Style = [] OldCreateOrder = False OnClose = FormClose OnCreate = FormCreate PixelsPerInch = TextHeight = object ControlBar : TControlBar Left = Top = Width = Height = Align = alTop AutoSize = True TabOrder = object ToolBar : TToolBar Left = Top = Width = Height = ButtonHeight = ButtonWidth = Caption = ToolBar EdgeInner = esNone EdgeOuter = esNone Flat = True ShowCaptions = True TabOrder = object tbConnect: TToolButton Left = Top = Caption = 连接 ImageIndex = OnClick = tbConnectClick end object tbDisconnected: TToolButton Left = Top = Caption = 断开 ImageIndex = OnClick = tbDisconnectedClick end object tbClose: TToolButton Left = Top = Caption = 关闭 ImageIndex = OnClick = tbCloseClick end end end object Edit : TEdit Left = Top = Width = Height = TabOrder = Text = 你好! end object Memo : TMemo Left = Top = Width = Height = Align = alTop TabOrder = end object StatusBar: TStatusBar Left = Top = Width = Height = Panels = < item Width = end> SimplePanel = False end object ServerSocket: TServerSocket Active = False Port = ServerType = stNonBlocking OnListen = ServerSocketListen OnGetSocket = ServerSocketGetSocket OnClientConnect = ServerSocketClientConnect OnClientDisconnect = ServerSocketClientDisconnect OnClientRead = ServerSocketClientRead OnClientError = ServerSocketClientError Left = end end uClientMain pas对应的DFM文件(uClientMain dfm) object frmClientMain: TfrmClientMain Left = Top = BorderIcons = [biSystemMenu biMinimize] BorderStyle = bsSingle Caption = ClientSocket ClientHeight = ClientWidth = Color = clBtnFace Font Charset = DEFAULT_CHARSET Font Color = clWindowText Font Height = Font Name = MS Sans Serif Font Style = [] OldCreateOrder = False Position = poScreenCenter OnClose = FormClose OnShow = FormShow PixelsPerInch = TextHeight = object ControlBar : TControlBar Left = Top = Width = Height = Align = alTop AutoSize = True TabOrder = object ToolBar : TToolBar Left = Top = Width = Height = ButtonHeight = ButtonWidth = Caption = ToolBar EdgeInner = esNone EdgeOuter = esNone Flat = True ShowCaptions = True TabOrder = object tbConnected: TToolButton Left = Top = Caption = 连接 ImageIndex = OnClick = tbConnectedClick end object tbSend: TToolButton Left = Top = Caption = 发送 Enabled = False ImageIndex = OnClick = tbSendClick end object tbDisconnected: TToolButton Left = Top = Caption = 断开 Enabled = False ImageIndex = OnClick = tbDisconnectedClick end object tbClose: TToolButton Left = Top = Caption = 退出 ImageIndex = OnClick = tbCloseClick end end end object Edit : TEdit Left = Top = Width = Height = TabOrder = Text = 问候 end object Memo : TMemo Left = Top = Width = Height = Align = alTop TabOrder = end object StatusBar: TStatusBar Left = Top = Width = Height = Panels = < item Width = end> SimplePanel = False end object btnSend: TBitBtn Left = Top = Width = Height = Caption = 发送 Enabled = False TabOrder = OnClick = tbSendClick end object ClientSocket: TClientSocket Active = False ClientType = ctNonBlocking Port = OnConnecting = ClientSocketConnecting OnConnect = ClientSocketConnect OnDisconnect = ClientSocketDisconnect OnRead = ClientSocketRead OnError = ClientSocketError Left = end end cha138/Article/program/Delphi/201311/8511

相关参考

知识大全 运用异步输入输出流编写Socket进程通信

运用异步输入输出流编写Socket进程通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  杨健(

知识大全 用Delphi编写系统进程监控程序

用Delphi编写系统进程监控程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本程序通过调用ke

知识大全 用Delphi编写打印程序的窍门

用Delphi编写打印程序的窍门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如果你想自己用D

知识大全 Delphi编写你的第一个COM程序

Delphi编写你的第一个COM程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!DELPHI菜单

知识大全 为Delphi编写的屏幕保护程序增加描述

为Delphi编写的屏幕保护程序增加描述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  虽说屏幕

知识大全 用Java编写简单的UDP网络通信程序

用Java编写简单的UDP网络通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java中

知识大全 使用 Java 编写 B/S 网络通信程序

使用Java编写B/S网络通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    网络上的系

知识大全 使用Java编写B/S网络通信程序

使用Java编写B/S网络通信程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!网络上的系统结构多

知识大全 利用浏览器实现程序界面与实现的分离

 引言  在用DelphiVisualBasic等可视化快速开发工具编写Windows应用程序时常会遇到这样几个问题    )希望程序界面美观在Delphi中开发人员通常使用各种控件来实现界面的风格化

知识大全 用Delphi编写圆周率模拟器[2]

用Delphi编写圆周率模拟器[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  程序首先在I