Delphi6中的TServerSocket在线程阻塞模式(TThreadBlocking)下,OnRead/OnWrite事件的是在主线程中执行的,虽为多线程,实际效率不高。
故我们若需要利用TServerSocket来开发真正多线程的服务器,则需要写TServerClientThread的子类,在这个子类中,自行处理数据的接收与发送,而重写的的重点在ClientExecute方法。下面为代码描述了这种编程思路。

type
  TServerForm=class(TForm)
  ...
  private
    procedure  GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
  end;

type
  TMyServerClientThread=class(TServerClientThread)
  private
    function WaitForData(TimeOut:Integer):Boolean;
  protected
    procedure ClientExecute;override;
  end;

implementation

{ TMyServerClientThread }

function TMyServerClientThread.WaitForData(TimeOut: Integer): Boolean;
var
  FDSet:TFDSet;
  TimeVal:TTimeVal;
begin
  FD_ZERO(FDSet);
  FD_SET(ClientSocket.SocketHandle,FDSet);
  TimeVal.tv_sec:=TimeOut div 1000;
  TimeVal.tv_usec:=TimeOut mod 1000;
  Result:=select(0,@FDSet,nil,nil,@TimeVal)>0
end;

procedure TMyServerClientThread.ClientExecute;
var
  InputBuffer:TSockBuffer;
  iLen,iPos:Integer;
  sCmd:string;
  tmpBuf:string;
begin
  InputBuffer:=TSockBuffer.Create;
  try
    while not Terminated and ClientSocket.Connected do
    begin
      if WaitForData(500) and not Terminated then
      begin
        iLen:=ClientSocket.ReceiveLength;
        if iLen=0 then
        begin
          Break
        end else
        begin
          SetLength(tmpBuf,iLen);
          ClientSocket.ReceiveBuf(tmpBuf[1],iLen);
          InputBuffer.WriteBuffer(tmpBuf[1],iLen);
          iPos:=InputBuffer.Pos(EOL);
          if iPos>0 then
          begin
            sCmd:=InputBuffer.Extract(iPos+1);
            Delete(sCmd,Length(sCmd)-1,2);
            if CmdList.IndexOf(sCmd)>-1 then
              ClientSocket.SendText('+OK');
            if SameText(sCmd,'EXIT') then
              Break;
          end;
        end;
      end;
    end;
  finally
    InputBuffer.Free;
  end;
end;

{ TServerForm }

procedure TServerForm.FormCreate(Sender: TObject);
begin
  with TServerSocket.Create(Self) do
  begin
    Port:=4001;
    ServerType:=stThreadBlocking;
    OnGetThread:=GetThread; //这一步是关键,OnGetThread事件产生时,创建自己的线程。
    Active:=True;
  end;
end;

procedure TServerForm.GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  SocketThread:=TMyServerClientThread.Create(False,ClientSocket);
end;

TServerSocket阻塞模式下Request-Response编程框架相关推荐

  1. Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)

    Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...

  2. connect函数在阻塞和非阻塞模式下的行为

    connect函数在阻塞和非阻塞模式下的行为 当socket使用阻塞模式时,connect函数会阻塞到有明确结果才会返回,如果网络环境较差,可能要等一会,影响体验, 为了解决这个问题,我们使用异步co ...

  3. socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)

    socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...

  4. c++多线程模式下的socket编程(线程池实现)

    socket 编程可以说是一个基本的技术掌握,而多个客户端向服务端发送请求又是一个非常常见的场景,因此多线程模式下的socket编程则显得尤为常见与重要. 本文主要利用线程池的技术,来实现多线程的模式 ...

  5. 非阻塞模式下 SEND 和 RECV 函数的返回值总结

    send 和 recv 函数的各种返回值意义: 返回值 n 返回值含义 大于 0 成功发送 n 个字节 0 对端关闭连接 小于 0( -1) 出错或者被信号中断或者对端 TCP 窗口太小数据发不出去( ...

  6. 转:Socket在阻塞模式下的信息收发和文件接收

    概述: 收发数据是网络编程的主题,在套接字上收发数据我们可以使用send和recv,当然还有Winsock2的WSASend和WSARecv.我们这里只讨论send和recv. 套接字可以工作在阻塞态 ...

  7. 保护模式下C语言编程,关于windows ring3保护模式与中断调用

    关于windows ring3保护模式与中断调用 最近发现了一个问题,就是进行某些中断调用时,并不如想象中的那样执行. 比如一个简单的ROM BASIC调用,我的机器(XP系统)弹出一个对话框:NTV ...

  8. Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误

    今天再测试socket的时候,发现一个很奇怪的问题,就是客户端再connect的时候第一次connect总是会返回-1,errno是115,往往第二次连接就可以成功了.但是对于服务端来说,第一次连接已 ...

  9. 非阻塞模式WinSock编程入门

    介绍 WinSock是Windows提供的包含了一系列网络编程接口的套接字程序库.在这篇文章中,我们将介绍如何把它的非阻塞模式引入到应用程序中.文章中所讨论的通信均为面向连接的通信(TCP),为清晰起 ...

  10. 非阻塞模式WinSock编程入门(Socket关联窗口消息机制)

    本文版权归 CSDN trcj 所有,转载请自觉按如下方式于明显位置标明原作者及出处,以示尊重! 作者:trcj 原文:http://blog.csdn.net/trcj1/archive/2010/ ...

最新文章

  1. 【SRX】RE与PFE策略不同步,导致Commit失败-----案例分析
  2. ConcurrentHashMap的源码分析-sizeCtl扩容退出机制
  3. 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
  4. C语言口令,某一本地口令验证函数(c语言环境,x86_32指令集)包含如下关键代码:某用户的口令保存在字符数组origpassw...
  5. Asp.net源码上周更新目录(5.12-5.18)
  6. python内置函数下划线_python(内置函数)
  7. exfat默认配置大小_如何分配U盘exFAT格式单元大小保证速度和空间呢
  8. 基于2018年世界杯赛事法国队夺冠进球数据分析
  9. html5简单画版,sketchpad-简单的HTML5 Canvas涂鸦画板插件
  10. Android 动画丢帧问题
  11. Qt+OpenCV在arm板上运行实现思路
  12. windows xp 下载老版本的chrome浏览器
  13. 了解python中的进程,线程和协成
  14. MFC双人五子棋(VS2019)
  15. C# dataGridView中插入excel表格
  16. 华为“扫地僧”纯手打《趣谈—网络协议.pdf》,看完只剩一个字:香
  17. Windbg调试学习
  18. 【solidity】函数修饰器(Function Modifiers)
  19. 电视连续剧——穿帮大汇总
  20. 品管七大手法-5控制图(转载)

热门文章

  1. MYSQL无法连接,提示10055错误尝试解决
  2. C++ - dynamic_cast
  3. unix网络编程之基本套接口编程
  4. Box2DWeb_04之碰撞检测
  5. 群体智能优化算法之狩猎搜索(Hunting Search,Hus)
  6. 【LeetCode】【数组】题号:56,重塑矩阵
  7. sklearn——决策树基础概念
  8. ENVI实验教程(4)实验四、遥感图像预处理—融合、镶嵌、裁剪
  9. Python学习总结(5)——字符串
  10. ArcMAP 用不同颜色区分地类