行的,因为有 TCustomWinSocket 这个参数类型,它应该是标准 Server 方 Socket 的返回值。 procedure TChatForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end; procedure TChatForm.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.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); begin Memo2.Lines.Clear; end; procedure TChatForm.ClientSocketDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin ListenItemClick(nil); end; 这两段比较简单。其中 ServerSocketClientConnect 在 ServerSocket 收到一个新的连接时 触发。而 ClientSocketDisconnect 在 ClientSocket 发出 Disconncet 时触发。 procedure TChatForm.Exit1Click(Sender: TObject); begin ServerSocket.Close; ClientSocket.Close; Close; end; procedure TChatForm.Disconnect1Click(Sender: TObject); begin 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)。 Client 方相对简单:Socket()--Connect()[通过一定的 port 连接特定的服务器,这是与服务 器建立连接]--Write()--Read()。 Socket 可以是基于 TCP 的,也可以是基于 UDP,同时 Socket 甚至建立在其他的协议,比 如 IPX/SPX,DECNet 等。在新建一个 Socket 时,可以指定新建何类 Socket。Bind()用来同 服务器的地址邦定, 如果一个主机只有一个 IP 地址, 实际上邦定的作用就相对多余了。 Listen() 开始监听
网络,Accept()用于接受连接,其返回值是保持同客户机联系的 Socket。 在 Delphi 中,对于 Windows 中的 Socket 进行了有效的封装。在
Delphi 中,按其继承关 系,可以分层两类: 一 、 TComponent - - TAbstractSocket - - TCustomSocket - - TCustomServerSocket - - TServerSocket TComponent--TAbstractSocket--TCustomSocket--TClientSocket 二、直接从 TObject 继承过来:
TObject--TCustomWinSocket--TServerWinSocket TObject--TCustomWinSocket--TClientWinSocket TObject--TCustomWinSocket--TServerClientWinSocket 可以看出第一类建立在 TCustomSocket 基础上,第二类建立在 TCustomWinSocket 的基 础上。第一类建立在 TComponet 的基础上,第二类直接构建在 TObject 基础上。因此如果用 户非常熟悉 Socket 并且想要编写控制台程序时,可以使用 TCustomWinScoket 类。 同 uses 中可以看出,它们都在 ScktComp.pas 中实现,而在 schtComp.pas 中,则包含了 winsock.pas 文件,如果继续深入