Mainfrm.PAS
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit Mainfrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer,
  6.   IdTCPConnection, IdTCPClient, ExtCtrls,communication,DiskList, Menus;
  7. type
  8.   TfrmMain = class(TForm)
  9.     Panel1: TPanel;
  10.     btnClientOpen: TButton;
  11.     btnServerOpen: TButton;
  12.     btnClientSend: TButton;
  13.     btnServerRecv: TButton;
  14.     btnClientStop: TButton;
  15.     btnServerStop: TButton;
  16.     btnClientClose: TButton;
  17.     btnServerClose: TButton;
  18.     GroupBox1: TGroupBox;
  19.     GroupBox2: TGroupBox;
  20.     mmoRecv: TMemo;
  21.     mmoSend: TMemo;
  22.     procedure btnClientOpenClick(Sender: TObject);
  23.     procedure btnServerOpenClick(Sender: TObject);
  24.     procedure btnClientSendClick(Sender: TObject);
  25.     procedure btnServerRecvClick(Sender: TObject);
  26.     procedure btnClientStopClick(Sender: TObject);
  27.     procedure btnServerStopClick(Sender: TObject);
  28.     procedure btnClientCloseClick(Sender: TObject);
  29.     procedure btnServerCloseClick(Sender: TObject);
  30.   private
  31.     { Private declarations }
  32.   public
  33.     { Public declarations }
  34.   end;
  35.   //客户端发送线程
  36.   TclientSend = class(TThread)
  37.   private
  38.     procedure send;
  39.   public
  40.     procedure execute; override;
  41.   end;
  42.   //服务器端接收线程
  43.   TServerRecv = class(TThread)
  44.   private
  45.     procedure recv;
  46.   public
  47.     procedure execute; override;
  48.   end;
  49. var
  50.   frmMain: TfrmMain;
  51.   //标识客户端的发送线程是否运行
  52.   clientSend: boolean = False;
  53.   //标识服务器端的接收线程是否运行
  54.   serverRecv: boolean = false;
  55. implementation
  56. {$R *.dfm}
  57. //线程执行函数,循环向队列里写数据,作为测试使用
  58. procedure TclientSend.send;
  59. var
  60.   sendStr: string;
  61. begin
  62.   sendStr := 'welcome to Program in Delphi';
  63.   while ClientSend do
  64.   begin
  65.     if ClientWriteBuffer(sendStr, Length(sendStr)) < 0 then
  66.     begin
  67.       clientSend := false;
  68.       showMessage('磁盘队列已满');
  69.     end;
  70.     frmMain.mmoSend.Lines.Add(sendStr);
  71.     sleep(90);
  72.     application.ProcessMessages;
  73.   end;
  74. end;
  75. //线程执行
  76. procedure TClientSend.execute;
  77. begin
  78.   synchronize(send);
  79. end;
  80. //线程执行函数,循环从队列检测是否有可读队列,
  81. //如有,便读出来
  82. procedure TServerRecv.recv;
  83. var
  84.   recvStr: string;
  85.   buffersize: integer;
  86. begin
  87.   while serverRecv do
  88.   begin
  89.     recvstr := '';
  90.     bufferSize := 0;
  91.     serverReadBuffer(recvstr, buffersize);
  92.     if bufferSize > 0 then
  93.       frmMain.mmoRecv.lines.add(recvStr);
  94.     sleep(100);
  95.     application.ProcessMessages;
  96.   end;
  97. end;
  98. //线程执行
  99. procedure TServerRecv.execute;
  100. begin
  101.   synchronize(recv);
  102. end;
  103. //调用initServerConnect初始化服务器端的连接,开始监听,
  104. //并在服务器端建立或打开磁盘队列
  105. procedure TfrmMain.btnServerOpenClick(Sender: TObject);
  106. begin
  107.   if not initServerConnect(1234, 'd:Server.dat', 1024 * 1024) then
  108.     raise exception.Create('error');
  109. end;
  110. //调用initClientConnect初始化客户端的连接,
  111. //并建立或打开磁盘队列
  112. procedure TfrmMain.btnClientOpenClick(Sender: TObject);
  113. begin
  114.   if not initClientConnect('127.0.0.1', 1234, 'd:client.dat', 1024 * 1024) then
  115.     raise exception.Create('error');
  116. end;
  117. //服务器端调用线程,循环向从队列里读出数据
  118. procedure TfrmMain.btnServerRecvClick(Sender: TObject);
  119. begin
  120.   ServerRecv := True;
  121.   TServerRecv.Create(false);
  122. end;
  123. //客户端调用线程,循环向队列里写数据
  124. procedure TfrmMain.btnClientSendClick(Sender: TObject);
  125. begin
  126.   ClientSend := True;
  127.   TClientSend.Create(False);
  128. end;
  129. //停止服务器端读队列线程
  130. procedure TfrmMain.btnServerStopClick(Sender: TObject);
  131. begin
  132.   ServerRecv := False;
  133. end;
  134. //停止客户端写队列线程
  135. procedure TfrmMain.btnClientStopClick(Sender: TObject);
  136. begin
  137.   ClientSend := False;
  138. end;
  139. //关闭服务器端Socket的连接
  140. procedure TfrmMain.btnServerCloseClick(Sender: TObject);
  141. begin
  142.   DesServerConnect;
  143. end;
  144. //关闭客户端socket的连接
  145. procedure TfrmMain.btnClientCloseClick(Sender: TObject);
  146. begin
  147.   desClientConnect;
  148. end;
  149. end.