服务端主窗体代码 unit Unit_server;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls,Unit_GlobalVar;
type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Memo1: TMemo; SSock: TServerSocket; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure SSockGetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation uses Unit_operateThread; {$R *.dfm}
procedure TForm1.FormShow(Sender: TObject); begin SSendList:=TList.Create; //在一开始就把线程创建 SReivList:=TList.Create; end;
procedure TForm1.Button1Click(Sender: TObject); begin SSock.Active:=true; //打开服务器 end;
procedure TForm1.SSockGetThread(Sender: TObject;ClientSocket: TServerClientWinSocket;var SocketThread: TServerClientThread); var VOpertThrd:operateThread; //声明线程句屏 begin memo1.Lines.Add(有一客户端连入系统); VOpertThrd:=operateThread.Create(false,ClientSocket); //创建线程并启动线程,还要传入客户端套解字 end; end. 线程里的代码 unit Unit_operateThread;
interface
uses Classes,SysUtils,ScktComp,Unit_GlobalVar;
type operateThread = class(TServerClientThread) private FStr: string; protected //procedure Execute; override; procedure ClientExecute;override; public procedure ShowMsg; function recvCommHead (var ACommHead:TCommHead):integer; function recvCommBody (var ATommPack:TCommPack):integer; function SendCommPack(var ATommPack:TCommPack):integer; end;
implementation uses Unit_server; { operateThread }
procedure operateThread.ClientExecute; var VReceComm :TCommPack; //只声明一个包和一个结构体 VReceRole :TTRole;
begin // inherited; repeat FStr := 读写....; synchronize(showMsg); //与窗体同步添加显示 recvCommHead(VReceComm.ACommHead); //读包头注意传入的是整包的包头 recvCommBody(VReceComm); //传进整包 //复制收到的包体到结构体中,注意从整包中包体的0地址开始读, 大小是刚刚接收到的包头你的数据 move(VReceComm.ACommBody[0],VReceRole,VReceComm.ACommHead.ACommSize); FStr:=角色编号+VReceRole.SrcRNo+角色名称+VReceRole.SrcRName+角色说明+VReceRole.SrcRMemo; synchronize(showMsg); sleep(3000); until terminated; end; //******************************************************************** function operateThread.recvCommBody(var ATommPack: TCommPack): integer; var RecvHBuf :array[0..Const_MaxPackSize-1] of char; //注最大值 iResult:Integer; begin iResult:=0; fillchar(RecvHBuf,Const_MaxPackSize,#0); //清空接受的缓冲区 //用系统的保存的客户端套接字接受客户段内容,保存到暂存缓冲区 iResult:=ClientSocket.ReceiveBuf(RecvHBuf,ATommPack.ACommHead.ACommSize); //把缓冲区的数据从0开始复制到整体包的包体中,大小在前面接收到的包体中 move(RecvHBuf[0],ATommPack.ACommBody[0],ATommPack.ACommHead.ACommSize); result:=iResult; end; //******************************************************************** //接包头的注释可参见包体的注释 function operateThread.recvCommHead(var ACommHead: TCommHead): integer; var RecvHBuf :array[0..Const_MaxPackSize-1] of char; iResult:Integer; begin iResult:=0; fillchar(RecvHBuf,Const_MaxPackSize,#0); iResult:=ClientSocket.ReceiveBuf(RecvHBuf,sizeof(TCommHead)); move(RecvHBuf[0],ACommHead,sizeof(TCommHead)); result:=iResult; end; //******************************************************************** function operateThread.SendCommPack(var ATommPack: TCommPack): integer; begin
end; //******************************************************************** //线程与窗体的同步过程 procedure operateThread.ShowMsg; begin Unit_server.Form1.Memo1.Lines.Add(FStr); end;
end. |