nd; 这段
程序的主要功能就是当用户选择 ConnectItem 菜单项时,设置应用程序为客户机, 弹出 input 框,让用户输入服务器的地址。这也就是我们不一开始固定 ClientSocket 的 host 的原因,这样用户可以动态地连接不同的服务器。读者需要了解的是主机地址只是 Socket 作为客户机时具有的一个属性,Socket 作为服务器时“一般“不用地址,因为它同本机绑定。 4、在 memo1 的 keydown 方法中写入如下代码: procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_Return then if IsServer then ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1]) else ClientSocket.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);
begin IsServer := True; end; ServerSocket 的 Accept 方法,当客户机第一次连接时完成,通过其参数可以认为,它 是在标准的 accept 方法后执行的,因为有 TCustomWinSocket 这个参数类型,它应该是标 准 Server 方 Socket 的返回值。 procedure TChatForm.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Memo2.Lines.Add(Socket.ReceiveText); end; procedure TChatForm.ServerSocketClientRead(Sender: T
Object; 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)]-