⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uservermain.pas

📁 通过SOCKET套接字
💻 PAS
字号:
unit uServerMain;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons, OleCtrls,
  DBCOMLib_TLB;
const
    CMax=10;  //客户端最大连接数
type
  client_record=record
     CHandle: integer;          //客户端套接字句柄
     CSocket:TCustomWinSocket;    //客户端套接字
     CName:string;                //客户端计算机名称
     CAddress:string;             //客户端计算机IP地址
     CUsed: boolean;               //客户端联机标志
  end;
type
  TfrmServerMain = class(TForm)
    ServerSocket: TServerSocket;
    ControlBar1: TControlBar;
    ToolBar1: TToolBar;
    tbConnect: TToolButton;
    tbClose: TToolButton;
    tbDisconnected: TToolButton;
    Edit1: TEdit;
    Memo1: TMemo;
    StatusBar: TStatusBar;
    ListView1: TListView;
    Dbcom1: TDbcom;
    procedure tbConnectClick(Sender: TObject);
    procedure tbDisconnectedClick(Sender: TObject);
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketListen(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure tbCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
      var ClientSocket: TServerClientWinSocket);
    procedure ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
 
  private
    { Private declarations }
  public
    { Public declarations }
    session: array[0..CMax] of client_record;      //客户端连接数组
    Sessions: integer;                             //客户端连接数
  end;
var
  frmServerMain: TfrmServerMain;
implementation
{$R *.DFM}
//打开套接字连接,并使套接字进入监听状态
procedure TfrmServerMain.tbConnectClick(Sender: TObject);
begin
    ServerSocket.Open ;
    //Memo1.Lines.Add('服务器数据中心已经启动端口1025'+Socket.RemoteAddress);
end;
//关闭套接字连接,不再监听客户端的请求
procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);
begin
    ServerSocket.Close;
    StatusBar.Panels[0].Text :=timetostr(now)+'服务器套接字连接已经关闭,无法接受客户端的连接请求.';
end;
//从客户端读取信息
procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
    i:integer;
    tempitem:tlistitem;
    content:string;

        count:Integer;
     result:Integer;
    pvTagPars: olevariant;
     pVdata:olevariant;

begin
    //将从客户端读取的信息添加到listitem中
    //Memo1.Lines.Add(Socket.ReceiveText);
    content:=Socket.ReceiveText;
    tempitem:=listview1.items.add;
  tempitem.caption:=timetostr(now);
  tempitem.subitems.add(content);
  tempitem.subitems.add(inttostr(length(content))+'bytes');

      count:=1;
    pvTagPars:='a1.PV';
    //数据名

    pVdata:=content;//数据值
     //调用DBcom的方法
    result:=DbCom1.SetStringData(count, pvTagPars, pVdata);



    for i:=0 to sessions do
    begin
        //取得匹配的客户端
        if session[i].CHandle = Socket.SocketHandle then
        begin
session[i].CSocket.SendText('回复客户端'+session[i].CAddress+' ==> '+Edit1.Text);
       end;
    end;
end;
//服务器端套接字进入监听状态,以便监听客户端的连接
procedure TfrmServerMain.ServerSocketListen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
    StatusBar.Panels[0].Text :=timetostr(now)+'等待客户端连接...';
    Memo1.Lines.Add('服务器数据中心已经启动端口1025');
end;
//当客户端连接到服务器端以后;
procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
    i,j:integer;
begin
    j:=-1;
    for i:=0 to sessions do
    begin
        //在原有的客户端连接数组中有中断的客户端连接
        if not session[i].CUsed then
        begin
            session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄
            session[i].CSocket := Socket;                //客户端套接字
            session[i].CName := Socket.RemoteHost ;      //客户端计算机名称
            session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP
            session[i].CUsed := True;                     //连接数组当前位置已经占用
            Break;
        end;
        j:=i;
    end;
    if j=sessions then
    begin
        inc(sessions);
        session[j].CHandle := Socket.SocketHandle ;
        session[j].CSocket := Socket;
        session[j].CName := Socket.RemoteHost ;
        session[j].CAddress := Socket.RemoteAddress ;
        session[j].CUsed := True;
    end;
    StatusBar.Panels[0].Text := timetostr(now)+'客户端 '+Socket.RemoteHost + ' 已经连接';
      //Memo1.Lines.Add('服务器数据中心已经启动端口1025'+'---'+Socket.RemoteAddress);
end;
//当客户端断开连接时
procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
    i:integer;
begin
    for i:=0 to sessions do
    begin
        if session[i].CHandle =Socket.SocketHandle then
        begin
            session[i].CHandle :=0;
            session[i].CUsed := False;
            Break;
        end;
    end;
    StatusBar.Panels[0].Text :=timetostr(now)+'客户端 '+Socket.RemoteHost + ' 已经断开';
end;
//关闭窗口
procedure TfrmServerMain.tbCloseClick(Sender: TObject);
begin
    Close;
end;
procedure TfrmServerMain.FormCreate(Sender: TObject);
begin
    sessions := 0;
end;
procedure TfrmServerMain.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    ServerSocket.Close ;
end;
//当客户端正在与服务器端连接时
procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;
  Socket: Integer; var ClientSocket: TServerClientWinSocket);
begin
    StatusBar.Panels[0].Text :='客户端正在连接...';
end;
//客户端发生错误
procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
    StatusBar.Panels[0].Text :=timetostr(now)+'客户端'+Socket.RemoteHost +'发生错误!';
    ErrorCode := 0;
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -