ZSChatServer线程设计模型---客户端测试程序

ZSChatServer 线程设计模型
------客户端测试程序
Lanno Ckeeke                       LC2006051501
功能:
       此客户程序与《ZSChatServer线程设计模型》一文中实现的服务器程序建立连接,对其进行简单的数据传输正确性进行验证。此程序发送的数据为如下:
消息头TZSMsg
       
  1. pZSMsg^.Version := 2;
  2.         pZSMsg^.MsgID := $0001;
  3.         pZSMsg^.MsgTime := 100034;
  4.         pZSMsg^.MsgSrc.sin_family := AF_INET;
  5.         pZSMsg^.MsgSrc.sin_port := htons(5005);
  6.         pZSMsg^.MsgSrc.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  7.         pZSMsg^.MsgDst.sin_family := AF_INET;
  8.         pZSMsg^.MsgDst.sin_port := htons(5005);
  9.         pZSMsg^.MsgDst.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));

 
内容:
       
  1. strcopy(PChar(Integer(pData) + Sizeof(ZSMsg)),PChar(szMsg));

此程序只是为了验证消息包的结构,如何生成,如何向数据包中添加内容。特别注意消息包数据类型的转化的应用。
 
查看服务器端的接收数据是否正确,直接查看内存:
完整代码:
  1. unit zWinSocket;
  2.  
  3. interface
  4.  
  5. uses
  6.  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  8.  IdTCPClient,WinSock, ScktComp;
  9.  
  10. type
  11.  TForm1 = class(TForm)
  12.     btnCreateSocket: TButton;
  13.     ListBox1: TListBox;
  14.     Port: TEdit;
  15.     Label1: TLabel;
  16.     btnWSAStartup: TButton;
  17.     btnCleanup: TButton;
  18.     btnSend: TButton;
  19.     btnParseMessage: TButton;
  20.     procedure btnParseMessageClick(Sender: TObject);
  21.     procedure btnCreateSocketClick(Sender: TObject);
  22.     procedure btnWSAStartupClick(Sender: TObject);
  23.     procedure btnCleanupClick(Sender: TObject);
  24.     procedure btnSendClick(Sender: TObject);
  25.  private
  26.     { Private declarations }
  27.  public
  28.     { Public declarations }
  29.  end;
  30.  procedure CheckRc(str : PChar);
  31.  
  32. var
  33.  Form1: TForm1;
  34.  //WSADATA数据结构
  35.  zWsaData : TWSAData;
  36.  zSocket : TSOCKET; //定义Socket
  37.  zClientService: sockaddr_in; //定义地址信息
  38.  
  39. type
  40.        TZSMsg = record
  41.      Version : Integer;
  42.     MsgID : Integer;
  43.     MsgTime : Integer;
  44.     MsgSrc : sockaddr_in;
  45.     MsgDst : sockaddr_in;
  46.     MsgDstCnt : Integer;
  47.  end;
  48.  
  49. implementation
  50.  
  51. {$R *.dfm}
  52. //显示出错信息
  53. procedure CheckRc(str:PChar);
  54. begin
  55.      MessageBox(0,str,'WinError',MB_OK);
  56. end;
  57. procedure TForm1.btnParseMessageClick(Sender: TObject);
  58. var
  59.        ZSMsg : TZSMsg;
  60.  pZSMSG : ^TZSMsg;
  61.  pData : Pointer;
  62.  szMsg : string;
  63. begin
  64.  szMsg := 'zhangjianfang';
  65.  pData := AllocMem(SizeOf(ZSMsg) + Length(szMsg));
  66.  pZSMsg := pData;
  67.  pZSMsg^.Version := 2;
  68.  pZSMsg^.MsgID := $0001;
  69.  pZSMsg^.MsgTime := 100034;
  70.  pZSMsg^.MsgSrc.sin_family := AF_INET;
  71.  pZSMsg^.MsgSrc.sin_port := htons(5005);
  72.  pZSMsg^.MsgSrc.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  73.  pZSMsg^.MsgDst.sin_family := AF_INET;
  74.  pZSMsg^.MsgDst.sin_port := htons(5005);
  75.  pZSMsg^.MsgDst.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  76.  strcopy(PChar(Integer(pData) + Sizeof(ZSMsg)),PChar(szMsg));
  77.  FreeMem(pData);
  78. end;
  79.  
  80. procedure TForm1.btnCreateSocketClick(Sender: TObject);
  81. var
  82.         nRc : Integer;         //Reture code of WSA_fucntion
  83. begin
  84.  
  85.         //创建一个Socket
  86.               zSocket := socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
  87.         if zSocket = INVALID_SOCKET then
  88.         begin
  89.                CheckRc('socket');
  90.         end;
  91.  
  92.         //连接至C服务器程序
  93.         zClientService.sin_family := AF_INET;
  94.         zClientService.sin_addr.S_addr := inet_addr('127.0.0.1');
  95.         zClientService.sin_port := htons(StrToInt(self.Port.Text));
  96.         nRc := connect(zSocket,zClientService,SizeOf(zClientService));
  97.         if nRc = SOCKET_ERROR then
  98.         begin
  99.                CheckRc('connect');
  100.           WSACleanup();
  101.         end;
  102.  
  103. end;
  104. procedure TForm1.btnWSAStartupClick(Sender: TObject);
  105. var
  106.        nRc : Integer;
  107. begin
  108.        //启动WS2_32.dll
  109.        nRc := WSAStartup(MakeWord(2,2),zWSAData);
  110.  if Boolean(nRc) then
  111.         CheckRc('WSAStartup');
  112. end;
  113.  
  114. procedure TForm1.btnCleanupClick(Sender: TObject);
  115. begin
  116.               closesocket(zSocket);
  117.         WSACleanup();
  118. end;
  119.  
  120. procedure TForm1.btnSendClick(Sender: TObject);
  121. var
  122.               nSendBytes : Integer; //Num of send data
  123.         nRecvBytes : Integer; //Num of receive data
  124.         szSendBuf : PChar;     //char Data to send
  125.         strSendBuf: string;    //string data to send
  126.         szRecvBuf : array[0..260of Char; //buf to receive data
  127.         nRc : Integer;         //Reture code of WSA_fucntion
  128.         i : Integer;
  129.         ZSMsg : TZSMsg;
  130.         pZSMSG : ^TZSMsg;
  131.         pData : Pointer;
  132.         szMsg : string;
  133. type
  134.        TArrSZMSG = array[0..4096of char;
  135.  TPArrSZMSG = ^TArrSZMSG;
  136. var
  137.         pszMsg : TPArrSZMSG;
  138. begin
  139.         //send & receive data
  140.         szSendBuf := 'Data from delphi Client';
  141.         strSendBuf := 'data from delphi';
  142.         //发送的数据为string类型
  143.         //nSendBytes := send(zSocket,strSendBuf[1],length(strSendBuf),0);
  144.  
  145.         //发送的数据为char
  146.         //Send msg data
  147.         //nSendBytes := send(zSocket,szSendBuf[0],length(szSendBuf),0);
  148.  
  149.         //发送的数据为TZSMsg类型
  150.         szMsg := 'zhangjianfang';
  151.         pData := AllocMem(SizeOf(ZSMsg) + Length(szMsg));
  152.         pZSMsg := pData;
  153.         pZSMsg^.Version := 2;
  154.         pZSMsg^.MsgID := $0001;
  155.         pZSMsg^.MsgTime := 100034;
  156.         pZSMsg^.MsgSrc.sin_family := AF_INET;
  157.         pZSMsg^.MsgSrc.sin_port := htons(5005);
  158.         pZSMsg^.MsgSrc.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  159.         pZSMsg^.MsgDst.sin_family := AF_INET;
  160.         pZSMsg^.MsgDst.sin_port := htons(5005);
  161.         pZSMsg^.MsgDst.sin_addr.S_addr := inet_addr(PChar('127.0.0.1'));
  162.         strcopy(PChar(Integer(pData) + Sizeof(ZSMsg)),PChar(szMsg));
  163.  
  164.         pszMsg := pData;
  165.         nSendBytes := send(zSocket,pszMsg[0],SizeOf(ZSMsg) + Length(szMsg),0);
  166.         self.ListBox1.Items.Add('Num of Send = ' + IntToStr(nSendBytes));
  167.         //Free msg data
  168.         FreeMem(pData);
  169.  
  170.         //接收从C服务器发送的数据
  171.         nRecvBytes := recv(zSocket,szRecvBuf,260,0);
  172.         if nRecvBytes < 0 then
  173.                Exit;
  174.         if nRecvBytes = -1 then
  175.                CheckRc('recv');
  176.  
  177.         //在组件中显示接收到的信息
  178.         self.ListBox1.Items.Add('NumOfRecv = ' + IntToStr(nRecvBytes));
  179.         self.ListBox1.Items.Add(szRecvBuf);
  180. end;
  181.  
  182. end.

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值