服务器程序代码
服务器程序片断如代码列表2所示。
代码列表2
| procedure TFormMain.BtnStartClick(Sender: TObject); begin IdTCPServer.DefaultPort := StrToInt(EdtPort.Text); IdTCPServer.Active := True; BtnStart.Enabled := False; BtnStop.Enabled := True; LbLog.Items.Add('服务器已成功启动!'); end; procedure TFormMain.BtnStopClick(Sender: TObject); begin IdTCPServer.Active := False; BtnStart.Enabled := True; BtnStop.Enabled := False; LbLog.Items.Add('服务器已成功停止!'); end; procedure TFormMain.IdTCPServerConnect(AThread: TIdPeerThread); begin LbLog.Items.Add('来自主机 ' + AThread.Connection.Socket.Binding.PeerIP + ' 的连接请求已被接纳!'); AThread.Connection.WriteLn('100: 欢迎连接到简单TCP服务器!'); end; procedure TFormMain.IdTCPServerExecute(AThread: TIdPeerThread); var sCommand: string; begin with AThread.Connection do begin sCommand := ReadLn(); FLogEntry := sCommand + ' 来自于主机 ' + AThread.Connection.Socket.Binding.PeerIP; AThread.Synchronize(AddLogEntry); if AnsiStartsText('DATA ', sCommand) then begin FReceived := RightStr(sCommand, Length(sCommand)-5); WriteLn('200: 数据接收成功!'); AThread.Synchronize(DisplayData); end else if SameText(sCommand, 'QUIT') then begin FLogEntry := '断开同主机 ' + AThread.Connection.Socket.Binding.PeerIP + ' 的连接!'; AThread.Synchronize(AddLogEntry); Disconnect; end else begin WriteLn('500: 无法识别的命令!'); FLogEntry := '无法识别命令:' + sCommand; AThread.Synchronize(AddLogEntry); end;//endif end; end; procedure TFormMain.DisplayData(); begin EdtData.Text := FReceived; end; procedure TFormMain.AddLogEntry(); begin LbLog.Items.Add(FLogEntry); end; |
“启动”按钮设置IdTCPServer 的Active属性为True来启动服务器,“停止”按钮设置Active属性为False来关闭服务器。
IdTCPServerConnect方法作为IdTCPServer 的OnCorrect事件响应过程,向客户端发送欢迎信息。OnCorrect事件在一个客户连接请求被接受时发生,为该连接创建的线程AThread被作为参数传递给IdTCPServerConnect方法。
IdTCPServerExecute方法是IdTCPServer 的OnExecute事件响应过程。OnExecute事件在TIdPeerThread对象试图执行其Run方法时发生。OnExecute事件与通常的事件有所不同,其响应过程是在某个线程上下文中执行的,参数AThread就是调用它的线程。这一点很重要,它意味着可能有多个OnExecute事件响应过程被同时执行。在连接被断开或中断前,OnExecute事件响应过程会被反复执行。
在IdTCPServerExecute方法中,首先读入一条指令,然后对指令进行判别。如果是DATA指令,就解出数据并显示它。如果收到的是QUIT指令,则断开连接。需要特别指出的是,由于IdTCPServerExecute方法在某一线程上下文中执行,因此显示数据和添加事件记录都是将相应的方法传递给Synchronize调用来完成的。
运行程序
运行客户端和服务器程序,按如下流程进行操作:
1. 按服务器程序的“启动”按钮启动服务器;
2. 按客户程序的“连接”按钮,建立同服务器的连接;
3. 在客户程序的待发送数据编辑框中输入“Hello, Indy!”,并按“发送”按钮发送数据;
4. 按客户程序的“断开”按钮,断开同服务器的连接;
5. 按服务器程序的“停止”按钮停止服务器。
程序运行的结果如图4和图5所示。

图4 简单的TCP客户

图5 简单的TCP服务器打开: http://www.qqread.com/cpp/d212248300.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Wlan组网----家庭专题 (4217篇文章)
- 在Ubuntu 7.10中用终端编译运行C++程序 (0次浏览)
- C与C++在Linux下的集成问题 (0次浏览)
- 浅析C++中虚函数的调用及对象内部布局 (0次浏览)
- 在C++中实现四种进程或线程同步互斥的控制 (0次浏览)
- Ubuntu下面的C语言代码检查工具 Splint (0次浏览)



