一、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); 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) > 0 then with ClientSocket do begin Host := Server; Active := True; ListenItem.Checked := False; end; e