下面是一个简单的 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); begin ListenItem.Checked := not ListenItem.Checked; if ListenItem.Checked then begin ClientSocket.Active := False; ServerSocket.Active := True; end else begin if ServerSocket.Active then ServerSocket.Active := False; end; end; 该程序段的说明如下:当用户选择 ListemItem 时,该 ListenItem 取反,如果选中的话, 说明处于 Listen 状态,读者要了解的是:listen 是 Socket 作为 Server 时一个专有的方法,如 果处于 listen,则 ServerSocket 设置为活动状态;否则,取消 listen,则关闭 ServerSocket。实 际上,只有用户一开始选择该菜单项,表明该程序用作 Server。反之,如果用户选择 ConnectItem,则必然作为 Client 使用。 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 if Length(Server) $#@62; 0 then with ClientSocket do begin Host := 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); 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 方法后执