delphi与socket

合集下载

delphi开发笔记

delphi开发笔记
Ctrl+End 将光标移至文件尾。
Ctrl+B Buffer List窗口。
Ctrl+I 同Tab键。
Ctrl+M 同Enter键。
Ctrl+N 同Enter键,但光标位置保持不变。
34 Ctrl+鼠标转轮 加速滚屏。
35 Shift+F8 调试时弹出CPU窗口。
36 Shift+F10 等于鼠标右键(Windows快捷键)。
37 Alt+F4 关闭所有编辑框中打开的源程序文件,但不关闭项目。
6 相反,在过程、函数、事件的定义处,SHIFT+CTRL+向下的方向键 可跳跃到具体过程、函数、事件内部
7 CTRL+ SHIFT + C:编写申明或者补上函数
8 SHIFT+CTRL+E 显示 EXPLORER
9 Ctrl+ shift + n (n=1,2,3,4......)定义书签
3、双击ConnectItem,敲入以下代码。
procedure TChatForm.ConnectItemClick(Sender: TObject);
begin
if ClientSocket.Active then ClientSocket.Active := False;
if InputQuery(Computer to connect to, Address Name:, Server) then
Ctrl+T 删除光标右边的一个单词。
Ctrl+Y 删除光标所在行。
Ctrl+Shift+↑ 光标在函数体内时,将光标快速移至当前函数声明处。

delphisocket发送和接受tcp信息包

delphisocket发送和接受tcp信息包

delphisocket发送和接受tcp信息包展开全文最近有个项目用到delphi 以前学过但是网络通讯这块不懂以前是直接接受字符串现在改用传递信息包希望大侠帮忙写下接受和发送特定信息包的代码下面为信息包的格式和内容数据包格式如下图所示,所包含的内容从左到右进行传输:包头中的信息全部为网络字节顺序!包头信息中,开始标识(head),版本信息(version)为固定格式;包体长度(length),提示整个包体(包括包头)的长度,接收方据此来完成一个业务数据包的接收和解析;命令号(command),为客户端和服务器约定的业务命令,从0到65535,具体定义详见下表:应答状态(status),请求时总设置为0;应答时,由SP应用服务程序返回相应的操作结果或错误原因;任务流水号(taskid)由自行定义,SP应用程序在响应包中必须返回,SP应用程序可以将此作为数据包一段时间内的唯一序列号。

发送方标识1(sender)、发送方标识2(sessionid)、时间戳(timestamp)以及保留字段(reserved),可以为发送方保留一些私有信息,返回包时原样返回。

包头信息中,除了包体长度(length)以外,其他的字段,包括开始标识(head),版本信息(version),任务流水号(taskid),发送方标识1(sender),发送方标识2(sessionid),时间戳(timestamp),以及数据加密标识(flag),需要在响应包中原样返回;流程1、通用网关在连接建立之后,根据刚才加密的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0038 2fd65329e2770074791503c2dab1d209fe0225636dd07f7277bd2 91209e1a498df28f7af2f0eb4f1be2831f0fa8987b7f9;其中业务加密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86系列的PC,需要做主机到网络(ntohs)字节顺序转换;2、 SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;3、SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理4、SP应用服务程序在发送之前,同样根据密匙对该返回字符串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是返回加密字节流的长度,而且是网络字节的以下是自己接受字符串的时的代码procedure TForm1.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);varlmsg:String;vflag,i,j:Integer;larriveDate:TarriveDate;ip:String;islimit:Boolean;resData:String;//返回数据buff:array[0..255]of byte;beginip:=Socket.RemoteAddress;islimit:=True;For j:=0 to ips.Count-1 DoBeginif (ip=ips[j]) thenbeginislimit:=False;end;End;if not islimit thenBeginCoInitialize(nil);Socket.ReceiveBuf(buff,4);//应该就在这里修改吧lmsg:=Socket.ReceiveText;SendTo();Memo1.Lines.Add(DateTimeTostr(now)+'来自主机'+ip+'的请求数据:'+lmsg );saveToLog(DateTimeTostr(now)+'来自主机'+ip+ ' 的请求数据:'+ lmsg);if lmsg<>'' thenBegintrysaveToLog(DateTimeTostr(now)+'开始处理接受数据'+lmsg);larriveDate:=analyecmdData(lmsg);vflag:=exChange(larriveDate);Memo1.Lines.Add('*'+Socket.ReceiveText+'*'+lmsg);Memo1.Lines.Add(DateTimeTostr(now)+'数据处理完毕:处理结果:'+inttostr(vflag));saveToLog(DateTimeTostr(now)+'数据处理完毕:处理结果:'+inttostr(vflag));exceptbeginvflag:=1;Memo1.Lines.Add(DateTimeTostr(now)+'数据处理异常:'+inttostr(vflag));saveToLog(DateTimeTostr(now)+'数据处理异常:'+inttostr(vflag));end;//vflag:=1;end;for i:=0 to sessions dobegin //取得匹配的客户端if session[i].CHandle = Socket.SocketHandle thenbegincase vflag of0: resData:=inttostr(vflag)+'$'+erID+'$'+larriv eDate.TelNo+'$'+inttostr(larriveDate.inPutKey);1: resData:='1'+'$'+'系统繁忙请稍后冲值';2: resData:='2'+'$'+'平台用户ID不存在';end;session[i].CSocket.SendText(resData);Memo1.Lines.Add(DatetimeT ostr(now)+'向客户端发送处理完毕命令'+resData);saveToLog(DatetimeTostr(now)+'向客户端发送处理完毕命令'+resData);end;end;end;CoUninitialize;endelseBeginCoInitialize(nil);CoUninitialize;// saveToLog(DatetimeTostr(now)+'非法访问Ip'+ip+'访问被阻止');End;end;。

delphi7 serversocket的多线程模式的用法

delphi7 serversocket的多线程模式的用法

delphi7 serversocket的多线程模式的用法在 Delphi 7 中,使用 ServerSocket 组件实现多线程模式可以通过以下步骤进行:1. 在 Delphi 7 的主界面上,双击 "ServerSocket" 组件,将其添加到窗体上。

2. 在 "ServerSocket1" 组件的 "Properties" 属性中,设置"Active" 属性为 True,启用服务器端。

3. 在 "ServerSocket1" 组件的 "Properties" 属性中,设置 "Port" 属性为服务器监听的端口号。

例如,设置为 1234。

4. 在 "ServerSocket1" 组件的 "Events" 事件属性中添加以下代码,实现多线程处理客户端连接请求:```procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin// 创建一个线程处理客户端连接TMyThread.Create(Socket);end;```5. 创建一个继承自 TThread 的自定义线程类,用于处理客户端连接和通信。

代码示例如下:```typeTMyThread = class(TThread)privateSocket: TCustomWinSocket;publicconstructor Create(ASocket: TCustomWinSocket);procedure Execute; override;end;constructor TMyThread.Create(ASocket: TCustomWinSocket); begininherited Create(False);Socket := ASocket;end;procedure TMyThread.Execute;varBuffer: array[0..1023] of AnsiChar;BytesReceived: Integer;begin// 处理客户端连接trywhile not Terminated dobegin// 接收客户端发送的数据BytesReceived := Socket.ReceiveBuf(Buffer, SizeOf(Buffer) - 1);Buffer[BytesReceived] := #0; // 末尾添加字符串结束标志// 在主线程执行 GUI 操作(如果需要)Synchronize(procedurebegin// 在此处更新界面或执行其他需要在主线程执行的操作 // Example: Memo1.Lines.Add(Buffer);end);// 处理接收到的数据// ...end;finally// 关闭客户端连接Socket.Close;Socket.Free;end;end;```在上述代码中,TMyThread 类继承自 TThread,通过重写Execute 方法,实现在独立线程中处理客户端连接和通信的逻辑。

DelphiSocket编程的基本概念

DelphiSocket编程的基本概念
– 端口号,端口类型(TCP,UDP,ICMP) – 高级命令格式(例如HTTP,FTP,……)
• 协议可以自定义,一般公用协议是作为RFC 给出的,如HTTP就是RFC 2616.
• 公用协议一般用文本方式
域名和DNS
• 域名是人类可阅读格式的“IP”地址
– 对人而言,容易阅读和记忆 – 对机器而言,可以随时更换IP而不用更改配置 – 域名和IP没有一一对应的关系,但一个域名在
Delphi Indy Socket 编程的基本概念
TCP/IP
• 传输控制协议和互联网协议,Transmission Control Protocol and Internet Protocol.
• 通常所说的TCP/IP表示传输承载 • TCP/IP会控制传输质量,这是最大的优势:
– 保证数据包到达的顺序 – 保证数据包不丢包,可靠到达对方 – 自动重传机制 – MTU概念:以太网默认1500Byte – 端口(PORT)概念

如果连接服务器不成功,则不能立即重连服务器, 需要等待10s再重连,如果10s后还是失败,则需要
等钟待后重30连s后,重以连此,类如推果30s还失败,则需要等待3分
端口
• Port是个整数,范围是1~65535 • 端口就像分机号 • 1024以下端口号是保留的,用作已知的公
用协议,如HTTP=80,FTP=21,POP3=110, SMTP=25等等 • 服务器要接受入站的请求,就必须监听一 个端口,客户端要和服务器通信,就要提 供IP地址和端口
协议
• 协议包含两个事情
阻塞和假死?
• 阻塞:如果没有用重叠I/O或者用线程来运行,直接调 用Socket的相关API,会一直等待对方的操作完成才能继 续做其他的事情

DELPHI高性能大容量SOCKET并发

DELPHI高性能大容量SOCKET并发

DELPHI高性能大容量SOCKET并发(一):IOCP完成端口例子介绍例子主要包括IOCP控件封装、服务端实现、传输协议和日志、控制、SQL查询、上传、下载等协议实现,并包括一些初步的性能测试结果。

服务端:界面截图如下:提供服务和桌面方式运行,桌面方式可直接打开程序,方便日常调试,可以使用命令行注册或卸载服务,在CMD中输入D:\DEMO\IOCPDemo\Bin\IOCPDemoSvr.exe -install来注册服务,在CMD输入D:\DEMO\IOCPDemo\Bin\IOCPDemoSvr.exe -uninstall来卸载服务。

客户端:界面截图如下:主要实现了服务端日志查看,服务端协议类表查看,SQL语句执行协议,上传、下载协议实现,其中对上传、下载实现了一个多线程同时传,用于测试服务器并发性能。

性能:支持超过2000个链接及以上同时上传文件,不过每个连接上传速度只有1到2K。

支持超过2W个连接同时在线传输命令。

单实例上传下载测试结果:从测试结果可以看出随着发送包增大,速度变快。

这里存在一个风险,就是SOCKET传输失败的次数也会增加。

(二):IOCP完成端口控件封装IOCP完成端口介绍:完成端口模型是Windows平台下SOCKET端口模型最为复杂的一种I/O模型。

如果一个应用程序需要同时管理为数众多的套接字,而且希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性提升,采用完成端口模型,往往可以达到最佳的系统性能。

完成端口可以管理成千上万的连接,长连接传文件可以支持5000个以上,长连接命令交互可以支持20000个以上。

这么大并发的连接,更需要考虑的是应用场景,按照100M的网卡传输速度12.5MB/S,如果是5000个传文件连接,则每个连接能分到的速度2.56KB/S;如果是20000个命令交互连接,则每个连接分到的吞吐量是655B/S,这种速度的吞吐量对很多应用是不满足,这时就要考虑加大网卡的传输速度或实现水平扩展,这个我们后续会介绍。

利用Delphi编写Socket通信程序

利用Delphi编写Socket通信程序

利用Delphi编写Socket通信程序一、前言随着计算机技术的不断发展,网络应用得到了越来越广泛的应用,而Socket编程作为网络编程中最基础、最重要的部分,具有非常重要的意义。

Delphi是一种构建Windows应用程序的高级集成开发工具,支持对象化设计、事件驱动、可视化编程等多种编程方式。

Delphi具有非常强大的GUI设计、数据访问、组件开发等特点,可以方便地应用到Socket编程中,实现Socket通信程序的开发。

本文就介绍利用Delphi编写Socket通信程序相关的知识。

二、Socket编程基础Socket是一种用于网络通信的编程接口,它把网络通信抽象成发送和接收数据的过程。

Socket编程分为客户端和服务器两部分,客户端负责向服务器发起连接请求,服务器则负责接收客户端的连接请求,并根据请求提供相应的服务。

Socket编程中,通常使用TCP/IP协议进行数据传输。

TCP协议是一种可靠的、面向连接的协议,它通过三次握手建立连接,保证数据的可靠性、完整性和顺序性。

而UDP协议则是一种不可靠的、无连接的协议,它不保证数据的可靠性和完整性,但具有数据传递速度快等特点。

通常,TCP协议适用于对数据可靠性要求较高的应用场景,如文件传输、邮件系统、即时通信等;而UDP协议适用于对数据传输速度要求较高的应用场景,如视频直播、网络游戏等。

三、利用Delphi编写Socket通信程序1. 创建Socket使用Delphi进行Socket编程,可通过TServerSocket和TClientSocket组件来实现。

TServerSocket组件用于创建服务器Socket,TClientSocket组件用于创建客户端Socket。

在Delphi中,可以通过在组件面板中拖拽TServerSocket或TClientSocket组件来创建Socket。

使用TServerSocket组件创建服务器Socket的示例代码如下:```delphiprocedure TMyForm.FormCreate(Sender: TObject);begin ServerSocket1.Port := 8888;ServerSocket1.Active := True;end;procedure TMyForm.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);beginMemo1.Lines.Add(Socket.RemoteAddress + ' connected.');end;```上述代码中,将ServerSocket1的Port属性设置为8888,表示该服务器监听8888端口的连接请求。

基于Delphi的Socket IO模型全接触(完整稿)

基于Delphi的Socket IO模型全接触(完整稿)

基于Delphi的Socket I/O模型全接触本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教。

一:select模型二:WSAAsyncSelect模型三:WSAEventSelect模型四:Overlapped I/O 事件通知模型五:Overlapped I/O 完成例程模型六:IOCP模型老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。

他们的信会被邮递员投递到他们的信箱里。

这和Socket模型非常类似。

下面我就以老陈接收信件为例讲解Socket I/O模型。

一:select模型老陈非常想看到女儿的信。

以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信,在这种情况下,“下楼检查信箱”然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。

select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/发送.......使用线程来select应该是通用的做法:procedure TListenThread.Execute;varaddr : TSockAddrIn;fd_read : TFDSet;timeout : TTimeVal;ASock, MainSock : TSocket;len, i : Integer;beginMainSock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );addr.sin_family := AF_INET;addr.sin_port := htons(5678);addr.sin_addr.S_addr := htonl(INADDR_ANY);bind( MainSock, @addr, sizeof(addr) );listen( MainSock, 5 );while (not Terminated) dobeginFD_ZERO( fd_read );FD_SET( MainSock, fd_read );_sec := 0;_usec := 500;if select( 0, @fd_read, nil, nil, @timeout ) > 0 then //至少有1个等待Accept的connectionbeginif FD_ISSET( MainSock, fd_read ) thenbeginfor i:=0 to fd_read.fd_count-1 do //注意,fd_count <= 64,也就是说select只能同时管理最多64个连接beginlen := sizeof(addr);ASock := accept( MainSock, addr, len );if ASock <> INVALID_SOCKET then....//为ASock创建一个新的线程,在新的线程中再不停地selectend;end;end;end; //while (not self.Terminated) doshutdown( MainSock, SD_BOTH );closesocket( MainSock );end;二:WSAAsyncSelect模型后来,老陈使用了微软公司的新式信箱。

CCDelphi的Socket编程

CCDelphi的Socket编程

CCDelphi的Socket编程今天分别用ViualC#2003,DevC++4,Delphi7编写了Socket的client 发数据给erver的两端程序,并成功实现了不同种程序间的通讯。

比如delphiocketclient或C++ocketclient访问C#ocketerver和C++ocketerver。

其中C++运行最快,C#最稳定,Delphi编写最快,效率也还行。

C++的代码如果在linu某下编译,可在linu某下运行。

delphi代码放到kyli某下或许也行。

C#的恐怕要edit后用Mono编译才能在Linu某下运行。

下面代码在ViualC#2003下编译通过/某某某某某某某某某某某某SocketClient某某某某VSC#2003某某某某某某某某某某某某某某某某某某某某/uingSytem;namepaceWindowApplication3{//////Form1的摘要说明。

///publicclaForm1:Sytem.Window.Form.Form{bellabel1;privateSytem.Window.For bellabel2;privateSytem.Window.Form.Te某tBo某te某tBo某1;privateSytem.Window.Form.Te某tBo某te某tBo某2;bellabel3;privateSytem.Window.Form. Buttonbutton1;privateSytem.Window.Form.Buttonbutton2;privateSyte m.Window.Form.StatuBartatuBar1;privateSytem.Window.Form.LitBo某litBo某1;//////必需的设计器变量。

intport=8000;//定义侦听端口号privateTcpClienttcpc;//对服务器端创建TCP连接privateSockettSend;//创建发送数据套接字privatebooltcpConnect=fale;//定义标识符,用以表示TCP连接是否建立///publicForm1(){////Window窗体设计器支持所必需的/////清理所有正在使用的资源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、Delphi与Socket计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。

TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet 登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。

TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。

Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。

套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。

微软的Windows Socket规范(简称winsock)对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。

在Delphi中,其底层的Socket也应该是Windows的Socket。

Socket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);Inprise在Delphi中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。

下面我们实例解读在Delphi中如何利用Socket编写通信程序。

二、利用Delphi编写Socket通信程序。

下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。

具体步骤如下:1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard 栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。

下面我们一边编写代码一边解释原因。

2、双击ListemItem。

写入如下代码:procedure TChatForm.ListenItemClick(Sender: TObject);beginListenItem.Checked := not ListenItem.Checked;if ListenItem.Checked thenbeginClientSocket.Active := False;ServerSocket.Active := True;endelsebeginif ServerSocket.Active thenServerSocket.Active := False;end;该程序段的说明如下:当用户选择ListemItem时,该ListenItem取反,如果选中的话,说明处于Listen状态,读者要了解的是:listen是Socket作为Server时一个专有的方法,如果处于listen,则ServerSocket设置为活动状态;否则,取消listen,则关闭ServerSocket。

实际上,只有用户一开始选择该菜单项,表明该程序用作Server。

反之,如果用户选择ConnectItem,则必然作为Client使用。

3、双击ConnectItem,敲入以下代码。

procedure TChatForm.ConnectItemClick(Sender: TObject);beginif ClientSocket.Active then ClientSocket.Active := False;if InputQuery(Computer to connect to, Address Name:, Server) thenif Length(Server) > 0 thenwith ClientSocket dobeginHost := Server;Active := True;ListenItem.Checked := False;end;end;这段程序的主要功能就是当用户选择ConnectItem菜单项时,设置应用程序为客户机,弹出input框,让用户输入服务器的地址。

这也就是我们不一开始固定ClientSocket的host 的原因,这样用户可以动态地连接不同的服务器。

读者需要了解的是主机地址只是Socket 作为客户机时具有的一个属性,Socket作为服务器时“一般“不用地址,因为它同本机绑定。

4、在memo1的keydown方法中写入如下代码:procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif Key = VK_Return thenif IsServer thenServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1]) elseClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);end;该段代码的作用很明显,就是开始发消息了。

其中如果是Server的话,它只向第一个客户机发消息,由于一个服务器可以连接多个客户机,而同客户机的每一个连接都由一个Socket来维持,因此ServerSocket.Socket.Connnections数组中存储的就是同Client维持连接的Socket。

在标准Socket中,服务器方的Socket通过accept()方法的返回值获取维持同客户机连接的Socket,而发送、接受消息的方法分别为send(sendto)和recv(recvfrom), Delphi对此进行了封装。

5、其余代码的简要介绍。

procedure TChatForm.ServerSocketAccept(Sender: TObject;Socket: TCustomWinSocket);IsServer := True;end;ServerSocket的Accept方法,当客户机第一次连接时完成,通过其参数可以认为,它是在标准的accept方法后执行的,因为有TCustomWinSocket这个参数类型,它应该是标准Server方Socket的返回值。

procedure TChatForm.ClientSocketRead(Sender: TObject;Socket: TCustomWinSocket);beginMemo2.Lines.Add(Socket.ReceiveText);end;procedure TChatForm.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);beginMemo2.Lines.Add(Socket.ReceiveText);end;这两段代码分别是服务器方和客户机方在收到对方的消息时,由Delphi触发的,作用是在memo2中显示收到的消息。

其中,ClientSocketRead中的Socket实际上就是Socket 本身,而在ServerSocketClientRead中的Socket实际上是ServerSocket.Socket.Connection[]中的某个Socket。

不过在Delphi中,对服务器方的Socket进行了有效的封装。

procedure TChatForm.ServerSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);beginMemo2.Lines.Clear;end;procedure TChatForm.ClientSocketDisconnect(Sender: TObject;Socket: TCustomWinSocket);beginListenItemClick(nil);end;这两段比较简单。

其中ServerSocketClientConnect在ServerSocket收到一个新的连接时触发。

而ClientSocketDisconnect在ClientSocket发出Disconncet时触发。

procedure TChatForm.Exit1Click(Sender: TObject);beginServerSocket.Close;ClientSocket.Close;Close;end;procedure TChatForm.Disconnect1Click(Sender: TObject);ClientSocket.Active := False;ServerSocket.Active := True;end;第一段为关闭应用程序。

在标准Socket中,每个Socket在关闭时,必须调用closesocket()方法,否则系统不会释放资源。

而在ServerSockt.Close和ClientSocket.Close中,系统内部肯定调用了closesocket()方法。

三、标准Socket与Delphi中的Socket。

标准的Socket的应用程序框架如下:Server方: Socket()[ 新建一个Socket]--Bind()[ 同服务器地址邦定 ]--Listen() --Accept()--block wait--read()[接受消息,在windows平台中,方法为send(TCP),或者是sendto(UDP)]--处理服务请求--Write()[发送消息,在windows平台中,方法为send(TCP), 或者为sendto(UDP)。

相关文档
最新文档