uServerMain.pas
上传用户:cnjnqp
上传日期:2022-05-02
资源大小:194k
文件大小:6k
源码类别:

打印编程

开发平台:

Delphi

  1. unit uServerMain;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons, Registry, Spin;
  6. const
  7.   CMax = 10; //客户端最大连接数
  8. type
  9.   client_record = record
  10.     CHandle: integer; //客户端套接字句柄
  11.     CSocket: TCustomWinSocket; //客户端套接字
  12.     CName: string; //客户端计算机名称
  13.     CAddress: string; //客户端计算机IP地址
  14.     CUsed: boolean; //客户端联机标志
  15.   end;
  16. type
  17.   TfrmServerMain = class(TForm)
  18.     ServerSocket: TServerSocket;
  19.     StatusBar: TStatusBar;
  20.     Panel1: TPanel;
  21.     GroupBox1: TGroupBox;
  22.     Memo1: TMemo;
  23.     procedure tbConnectClick(Sender: TObject);
  24.     procedure tbDisconnectedClick(Sender: TObject);
  25.     procedure ServerSocketClientRead(Sender: TObject;
  26.       Socket: TCustomWinSocket);
  27.     procedure ServerSocketListen(Sender: TObject;
  28.       Socket: TCustomWinSocket);
  29.     procedure ServerSocketClientConnect(Sender: TObject;
  30.       Socket: TCustomWinSocket);
  31.     procedure ServerSocketClientDisconnect(Sender: TObject;
  32.       Socket: TCustomWinSocket);
  33.     procedure tbCloseClick(Sender: TObject);
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  36.     procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
  37.       var ClientSocket: TServerClientWinSocket);
  38.     procedure ServerSocketClientError(Sender: TObject;
  39.       Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  40.       var ErrorCode: Integer);
  41.   private
  42.     { Private declarations }
  43.   public
  44.     { Public declarations }
  45.     session: array[0..CMax] of client_record; //客户端连接数组
  46.     Sessions: integer; //客户端连接数
  47.   end;
  48. procedure ZebraPrint(data: string); stdcall; external 'Zebra105SL.dll';
  49. var
  50.   frmServerMain: TfrmServerMain;
  51. implementation
  52. {$R *.dfm}
  53. //split string
  54. function SplitString(const Source, ch: string): TStringList;
  55. var
  56.   temp: string;
  57.   i: Integer;
  58. begin
  59.   Result := TStringList.Create;
  60.   //假如是空自符串则返回空列表
  61.   if trim(Source) = ''
  62.     then exit;
  63.   temp := Source;
  64.   i := pos(ch, Source);
  65.   while i <> 0 do
  66.   begin
  67.     Result.add(copy(temp, 0, i - 1));
  68.     Delete(temp, 1, i);
  69.     i := pos(ch, temp);
  70.   end;
  71.   Result.add(temp);
  72. end;
  73. //打开套接字连接,并使套接字进入监听状态
  74. procedure TfrmServerMain.tbConnectClick(Sender: TObject);
  75. begin
  76.   ServerSocket.Open;
  77. end;
  78. //关闭套接字连接,不再监听客户端的请求
  79. procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);
  80. begin
  81.   ServerSocket.Close;
  82.   StatusBar.Panels[0].Text := '服务器套接字连接已经关闭,无法接受客户端的连接请求.';
  83. end;
  84. //从客户端读取信息
  85. procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;
  86.   Socket: TCustomWinSocket);
  87. var
  88.   arr: TStringList;
  89.   i: integer;
  90.   tmp: string;
  91. begin
  92.   tmp := Socket.ReceiveText;
  93.   Memo1.Text := tmp;
  94.   arr := SplitString(tmp, '|');
  95.   //ShowMessage(inttostr(arr.count));
  96.   if arr.count>1 then
  97.   begin
  98.     for i := 0 to arr.count - 1 do
  99.       ZebraPrint(arr[i]);
  100.       //ShowMessage(arr[i]);
  101.   end
  102. end;
  103. //服务器端套接字进入监听状态,以便监听客户端的连接
  104. procedure TfrmServerMain.ServerSocketListen(Sender: TObject;
  105.   Socket: TCustomWinSocket);
  106. begin
  107.   StatusBar.Panels[0].Text := '等待客户端连接...';
  108. end;
  109. //当客户端连接到服务器端以后
  110. procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject;
  111.   Socket: TCustomWinSocket);
  112. var
  113.   i, j: integer;
  114. begin
  115.   j := -1;
  116.   for i := 0 to sessions do
  117.   begin
  118.         //在原有的客户端连接数组中有中断的客户端连接
  119.     if not session[i].CUsed then
  120.     begin
  121.       session[i].CHandle := Socket.SocketHandle; //客户端套接字句柄
  122.       session[i].CSocket := Socket; //客户端套接字
  123.       session[i].CName := Socket.RemoteHost; //客户端计算机名称
  124.       session[i].CAddress := Socket.RemoteAddress; //客户端计算机IP
  125.       session[i].CUsed := True; //连接数组当前位置已经占用
  126.       Break;
  127.     end;
  128.     j := i;
  129.   end;
  130.   if j = sessions then
  131.   begin
  132.     inc(sessions);
  133.     session[j].CHandle := Socket.SocketHandle;
  134.     session[j].CSocket := Socket;
  135.     session[j].CName := Socket.RemoteHost;
  136.     session[j].CAddress := Socket.RemoteAddress;
  137.     session[j].CUsed := True;
  138.   end;
  139.   StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经连接';
  140. end;
  141. //当客户端断开连接时
  142. procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;
  143.   Socket: TCustomWinSocket);
  144. var
  145.   i: integer;
  146. begin
  147.   for i := 0 to sessions do
  148.   begin
  149.     if session[i].CHandle = Socket.SocketHandle then
  150.     begin
  151.       session[i].CHandle := 0;
  152.       session[i].CUsed := False;
  153.       Break;
  154.     end;
  155.   end;
  156.   StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经断开';
  157. end;
  158. //关闭窗口
  159. procedure TfrmServerMain.tbCloseClick(Sender: TObject);
  160. begin
  161.   Close;
  162. end;
  163. procedure TfrmServerMain.FormCreate(Sender: TObject);
  164. var
  165.   registry: TRegistry;
  166. begin
  167.   sessions := 0;
  168.   ServerSocket.Port := 1025;
  169.   ServerSocket.Open;
  170.   //运行自行注册
  171.   registry:=TRegistry.Create;
  172.   registry.RootKey:= HKEY_LOCAL_MACHINE; //HKEY_CURRENT_USER;
  173.   registry.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',true);
  174.   registry.WriteString('ZerbraPrinter', Application.ExeName);
  175.   registry.CloseKey;
  176. end;
  177. procedure TfrmServerMain.FormClose(Sender: TObject;
  178.   var Action: TCloseAction);
  179. begin
  180.   ServerSocket.Close;
  181. end;
  182. //当客户端正在与服务器端连接时
  183. procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;
  184.   Socket: Integer; var ClientSocket: TServerClientWinSocket);
  185. begin
  186.   StatusBar.Panels[0].Text := '客户端正在连接...';
  187. end;
  188. //客户端发生错误
  189. procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;
  190.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  191.   var ErrorCode: Integer);
  192. begin
  193.   StatusBar.Panels[0].Text := '客户端' + Socket.RemoteHost + '发生错误!';
  194.   ErrorCode := 0;
  195. end;
  196. end.