zoukankan      html  css  js  c++  java
  • DIOCP之DEMO-登陆验证设计

    登陆设计原理:

    (一)client在与服务器建立连接后向服务器发送含有"USER=XXXXX&PWD=XXXXX"或者用JSON字符串。

       client的代码需要写在OnContextConnected事件中,注{"cmd":"login","User":"admin","Pwd":"admin888"}

    (二)服务器收到客户端传来的命令串后,首先判断命令是不是login,查询USER是否在登陆列表或内存表或stringlist中,如果不在则查询数据库验证USER与PWD,正确后写入到登陆列表或内存表或stringlist,返回给客户验证结果,发送完成后关闭当前连接

     {"cmd":"login","result":"OK","quid":"XXXXXXXXXXXXXXX"} 
    {"cmd":"login","result":"error"}

    server的代码需要写在OnRecvBuffer事件中

     (三)以后每次操作时,都把quid的值再传给服务器表示自己已经通过验证或者用Session

    备注:

    Echoserver

    procedure TfrmMain.OnRecvBuffer(pvClientContext:TIocpClientContext;
    buf:Pointer; len:cardinal; errCode:Integer);
    var
    j, i:Integer;
    s:AnsiString;
    lvBuff:PByte;
    lvFileWriter:TSingleFileWriter;
    begin
    if FChkShowInMemo then
    begin
    // 如果客户端发送的为字符串,可以用下面代码进行显示
    SetLength(s, len);
    Move(buf^, s[1], len);
    sfLogger.logMessage(s);
    if s='stu=admin&pwd=admin123' then
    begin


    pvClientContext.PostWSASendRequest(PAnsiChar('Sucess'), Length('Sucess'));
    end
    else
    begin
    pvClientContext.PostWSASendRequest(PAnsiChar('error'), Length('error'));//返加错误的登陆信息
    pvClientContext.DoDisconnect;//关闭当前连接
    end;


    end;
    if FChkEcho then
    begin
    if FChkUseBufferPool then
    begin

    lvBuff := GetBuffer(FPool);

    Move(buf^, lvBuff^, len);

    //
    AddRef(lvBuff);


    pvClientContext.PostWSASendRequest(lvBuff, len, dtNone, 1);
    end else
    begin
    pvClientContext.PostWSASendRequest(buf, len);
    end;
    end;

    if FChkShowInMemo then
    begin
    lvFileWriter := TSingleFileWriter(pvClientContext.Data);
    if lvFileWriter = nil then
    begin
    lvFileWriter := TSingleFileWriter.Create;
    pvClientContext.Data := lvFileWriter;
    lvFileWriter.FilePreFix := Format('RECV_%d', [pvClientContext.SocketHandle]);
    lvFileWriter.FilePerSize := 1024 * 1024 * 100;
    end;

    lvFileWriter.WriteBuffer(buf, len);
    end;
    end;

    EchoClient:

    procedure TfrmMain.OnContextConnected(pvContext: TDiocpCustomContext);
    var
    s:AnsiString;
    begin

    TEchoContext(pvContext).FStartTime := Now();
    TEchoContext(pvContext).FLastTick := GetTickCount;
    TEchoContext(pvContext).FMaxTick := 0;

    s := mmoOnConnected.Lines.Text;
    if FSendDataOnConnected then
    begin
    DoSend(pvContext, edt1.Text);//连接后发送数据edt1.text里面为需要向服务器验证的信息
    end;

    end;

    本次没有用到数据库表,原理通了,其余的就简单了 

  • 相关阅读:
    AsyncHttpClient使用
    索引
    jdbc--取大量数据
    oracle--with as
    spring--mybatis事务总结
    Elasticsearch环境搭建
    使用idea远程调试
    redis分布式锁的实现
    知识梳理
    Zookeeper
  • 原文地址:https://www.cnblogs.com/diocp/p/5835603.html
Copyright © 2011-2022 走看看