ZSChatServer
线程设计模型
------客户端测试程序
Lanno Ckeeke
LC2006051501
功能:
此客户程序与《ZSChatServer线程设计模型》一文中实现的服务器程序建立连接,对其进行简单的数据传输正确性进行验证。此程序发送的数据为如下:
消息头TZSMsg
|
|
内容:
|
此程序只是为了验证消息包的结构,如何生成,如何向数据包中添加内容。特别注意消息包数据类型的转化的应用。
查看服务器端的接收数据是否正确,直接查看内存:
![](http://blog.csdn.net/images/blog_csdn_net/maxcode/ZSMsg.gif)
完整代码:
- unit zWinSocket;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
- IdTCPClient,WinSock, ScktComp;
- type
- TForm1 = class(TForm)
- btnCreateSocket: TButton;
- ListBox1: TListBox;
- Port: TEdit;
- Label1: TLabel;
- btnWSAStartup: TButton;
- btnCleanup: TButton;
- btnSend: TButton;
- btnParseMessage: TButton;
- procedure btnParseMessageClick(Sender: TObject);
- procedure btnCreateSocketClick(Sender: TObject);
- procedure btnWSAStartupClick(Sender: TObject);
- procedure btnCleanupClick(Sender: TObject);
- procedure btnSendClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- procedure CheckRc(str : PChar);
- var
- Form1: TForm1;
- //WSADATA数据结构
- zWsaData : TWSAData;
- zSocket : TSOCKET; //定义Socket
- zClientService: sockaddr_in; //定义地址信息
- type
- TZSMsg = record
- Version : Integer;
- MsgID : Integer;
- MsgTime : Integer;
- MsgSrc : sockaddr_in;
- MsgDst : sockaddr_in;
- MsgDstCnt : Integer;
- end;
- implementation
- {$R *.dfm}
- //显示出错信息
- procedure CheckRc(str:PChar);
- begin
- MessageBox(0,str,'WinError',MB_OK);
- end;
- procedure TForm1.btnParseMessageClick(Sender: TObject);
- var
- ZSMsg : TZSMsg;
- pZSMSG : ^TZSMsg;
- pData : Pointer;
- szMsg : string;
- begin
- szMsg := 'zhangjianfang';
- pData := AllocMem(SizeOf(ZSMsg) + Length(szMsg));
- pZSMsg := pData;
- pZSMsg^.Version := 2;
- pZSMsg^.MsgID := $0001;
- pZSMsg^.MsgTime := 100034;
- pZSMsg^.MsgSrc.sin_family := AF_INET;
- pZSMsg^.MsgSrc.sin_port := htons(5005);
- pZSMsg^.MsgSrc.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
- pZSMsg^.MsgDst.sin_family := AF_INET;
- pZSMsg^.MsgDst.sin_port := htons(5005);
- pZSMsg^.MsgDst.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
- strcopy(PChar(Integer(pData) + Sizeof(ZSMsg)),PChar(szMsg));
- FreeMem(pData);
- end;
- procedure TForm1.btnCreateSocketClick(Sender: TObject);
- var
- nRc : Integer; //Reture code of WSA_fucntion
- begin
- //创建一个Socket
- zSocket := socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
- if zSocket = INVALID_SOCKET then
- begin
- CheckRc('socket');
- end;
- //连接至C服务器程序
- zClientService.sin_family := AF_INET;
- zClientService.sin_addr.S_addr := inet_addr('127.0.0.1');
- zClientService.sin_port := htons(StrToInt(self.Port.Text));
- nRc := connect(zSocket,zClientService,SizeOf(zClientService));
- if nRc = SOCKET_ERROR then
- begin
- CheckRc('connect');
- WSACleanup();
- end;
- end;
- procedure TForm1.btnWSAStartupClick(Sender: TObject);
- var
- nRc : Integer;
- begin
- //启动WS2_32.dll
- nRc := WSAStartup(MakeWord(2,2),zWSAData);
- if Boolean(nRc) then
- CheckRc('WSAStartup');
- end;
- procedure TForm1.btnCleanupClick(Sender: TObject);
- begin
- closesocket(zSocket);
- WSACleanup();
- end;
- procedure TForm1.btnSendClick(Sender: TObject);
- var
- nSendBytes : Integer; //Num of send data
- nRecvBytes : Integer; //Num of receive data
- szSendBuf : PChar; //char Data to send
- strSendBuf: string; //string data to send
- szRecvBuf : array[0..260] of Char; //buf to receive data
- nRc : Integer; //Reture code of WSA_fucntion
- i : Integer;
- ZSMsg : TZSMsg;
- pZSMSG : ^TZSMsg;
- pData : Pointer;
- szMsg : string;
- type
- TArrSZMSG = array[0..4096] of char;
- TPArrSZMSG = ^TArrSZMSG;
- var
- pszMsg : TPArrSZMSG;
- begin
- //send & receive data
- szSendBuf := 'Data from delphi Client';
- strSendBuf := 'data from delphi';
- //发送的数据为string类型
- //nSendBytes := send(zSocket,strSendBuf[1],length(strSendBuf),0);
- //发送的数据为char
- //Send msg data
- //nSendBytes := send(zSocket,szSendBuf[0],length(szSendBuf),0);
- //发送的数据为TZSMsg类型
- szMsg := 'zhangjianfang';
- pData := AllocMem(SizeOf(ZSMsg) + Length(szMsg));
- pZSMsg := pData;
- pZSMsg^.Version := 2;
- pZSMsg^.MsgID := $0001;
- pZSMsg^.MsgTime := 100034;
- pZSMsg^.MsgSrc.sin_family := AF_INET;
- pZSMsg^.MsgSrc.sin_port := htons(5005);
- pZSMsg^.MsgSrc.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
- pZSMsg^.MsgDst.sin_family := AF_INET;
- pZSMsg^.MsgDst.sin_port := htons(5005);
- pZSMsg^.MsgDst.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
- strcopy(PChar(Integer(pData) + Sizeof(ZSMsg)),PChar(szMsg));
- pszMsg := pData;
- nSendBytes := send(zSocket,pszMsg[0],SizeOf(ZSMsg) + Length(szMsg),0);
- self.ListBox1.Items.Add('Num of Send = ' + IntToStr(nSendBytes));
- //Free msg data
- FreeMem(pData);
- //接收从C服务器发送的数据
- nRecvBytes := recv(zSocket,szRecvBuf,260,0);
- if nRecvBytes < 0 then
- Exit;
- if nRecvBytes = -1 then
- CheckRc('recv');
- //在组件中显示接收到的信息
- self.ListBox1.Items.Add('NumOfRecv = ' + IntToStr(nRecvBytes));
- self.ListBox1.Items.Add(szRecvBuf);
- end;
- end.