TServerSocket阻塞模式下Request-Response编程框架
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编程框架相关推荐
- Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)
Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...
- connect函数在阻塞和非阻塞模式下的行为
connect函数在阻塞和非阻塞模式下的行为 当socket使用阻塞模式时,connect函数会阻塞到有明确结果才会返回,如果网络环境较差,可能要等一会,影响体验, 为了解决这个问题,我们使用异步co ...
- socket的阻塞模式和非阻塞模式(send和recv函数在阻塞和非阻塞模式下的表现)
socket的阻塞模式和非阻塞模式 无论是Windows还是Linux,默认创建socket都是阻塞模式的 在Linux中,可以再创建socket是直接将它设置为非阻塞模式 int socket (i ...
- c++多线程模式下的socket编程(线程池实现)
socket 编程可以说是一个基本的技术掌握,而多个客户端向服务端发送请求又是一个非常常见的场景,因此多线程模式下的socket编程则显得尤为常见与重要. 本文主要利用线程池的技术,来实现多线程的模式 ...
- 非阻塞模式下 SEND 和 RECV 函数的返回值总结
send 和 recv 函数的各种返回值意义: 返回值 n 返回值含义 大于 0 成功发送 n 个字节 0 对端关闭连接 小于 0( -1) 出错或者被信号中断或者对端 TCP 窗口太小数据发不出去( ...
- 转:Socket在阻塞模式下的信息收发和文件接收
概述: 收发数据是网络编程的主题,在套接字上收发数据我们可以使用send和recv,当然还有Winsock2的WSASend和WSARecv.我们这里只讨论send和recv. 套接字可以工作在阻塞态 ...
- 保护模式下C语言编程,关于windows ring3保护模式与中断调用
关于windows ring3保护模式与中断调用 最近发现了一个问题,就是进行某些中断调用时,并不如想象中的那样执行. 比如一个简单的ROM BASIC调用,我的机器(XP系统)弹出一个对话框:NTV ...
- Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误
今天再测试socket的时候,发现一个很奇怪的问题,就是客户端再connect的时候第一次connect总是会返回-1,errno是115,往往第二次连接就可以成功了.但是对于服务端来说,第一次连接已 ...
- 非阻塞模式WinSock编程入门
介绍 WinSock是Windows提供的包含了一系列网络编程接口的套接字程序库.在这篇文章中,我们将介绍如何把它的非阻塞模式引入到应用程序中.文章中所讨论的通信均为面向连接的通信(TCP),为清晰起 ...
- 非阻塞模式WinSock编程入门(Socket关联窗口消息机制)
本文版权归 CSDN trcj 所有,转载请自觉按如下方式于明显位置标明原作者及出处,以示尊重! 作者:trcj 原文:http://blog.csdn.net/trcj1/archive/2010/ ...
最新文章
- 【SRX】RE与PFE策略不同步,导致Commit失败-----案例分析
- ConcurrentHashMap的源码分析-sizeCtl扩容退出机制
- 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
- C语言口令,某一本地口令验证函数(c语言环境,x86_32指令集)包含如下关键代码:某用户的口令保存在字符数组origpassw...
- Asp.net源码上周更新目录(5.12-5.18)
- python内置函数下划线_python(内置函数)
- exfat默认配置大小_如何分配U盘exFAT格式单元大小保证速度和空间呢
- 基于2018年世界杯赛事法国队夺冠进球数据分析
- html5简单画版,sketchpad-简单的HTML5 Canvas涂鸦画板插件
- Android 动画丢帧问题
- Qt+OpenCV在arm板上运行实现思路
- windows xp 下载老版本的chrome浏览器
- 了解python中的进程,线程和协成
- MFC双人五子棋(VS2019)
- C# dataGridView中插入excel表格
- 华为“扫地僧”纯手打《趣谈—网络协议.pdf》,看完只剩一个字:香
- Windbg调试学习
- 【solidity】函数修饰器(Function Modifiers)
- 电视连续剧——穿帮大汇总
- 品管七大手法-5控制图(转载)