Delphi WinSocket 通信

本文档介绍了使用Delphi进行WinSocket通信的实现,包括服务端和客户端的代码示例。服务端通过TServerSocket类创建并监听,使用select轮询接收客户端连接和数据。客户端则负责连接服务端并发送数据。示例代码展示了如何处理连接、接收数据和断开连接的过程。
摘要由CSDN通过智能技术生成

本示例中,涉及到的缓冲,均采取1024长度,采用的select轮询,现在select轮询已经被认为是比较低级的方法了,微软也不推荐使用,这里就以它开头吧,有时间,大家可以研究其他用法,比如WSAAsyncSelect模型WSAEventSelect模型Overlapped I/O 事件通知模型Overlapped I/O 完成例程模型IOCP模型 。下面开始贴代码了:

 

服务端单元:SocketServer

  1. unit SocketServer;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Classes,SyncObjs ,WinSock ,SysUtils;  
  7.   
  8. type  
  9.   TGetDataEvent = procedure(const stream:TMemoryStream) of object;  
  10.   TClientConnected = procedure(const socket: TSocket) of object;  
  11.   
  12.   TWorkThread = class;  
  13.   TServerItem = class;  
  14.   TSocketServer = class  
  15.   private  
  16.     FServerSocket : TSocket;  
  17.     //客户端连接列表   
  18.     FClientSocketList : TStringList;  
  19.     FServerItem : TServerItem;  
  20.   
  21.     //允许最大连接数   
  22.     FMaxClientCount : Integer;  
  23.     //客户端连接数   
  24.     FClientCount : Integer;  
  25.     //当前客户端的索引   
  26.     FClientIndex : Integer;  
  27.     //调用方的Handle   
  28.     FCallHandle : HWND;  
  29.     //接收用的内存流   
  30.     FRecStream : TMemoryStream;  
  31.     //接收缓冲区   
  32.     FRecBuf : array of byte;  
  33.   
  34.     FHost : AnsiString;  
  35.     FPort : Integer;  
  36.   
  37.     FTimeVal: TTimeVal;  
  38.   
  39.     //工作线程   
  40.     FWorkThread : TWorkThread;  
  41.   
  42.     //以下是自定义事件   
  43.     FOnGetData : TGetDataEvent;  
  44.     FOnClientConnected : TClientConnected;  
  45.   
  46.     //初始化套接字   
  47.     function InitSocket:Boolean;  
  48.     //从某个客户端套接字中获取数据   
  49.     procedure GetDataFromClient(socket:TSocket);  
  50.     //检查是否有新的客户端连接   
  51.     procedure CheckNewSocket;  
  52.   
  53.     procedure SetMaxClientCount(const Value:Integer);  
  54.     function GetMaxClientCount:Integer;  
  55.   
  56.     function GetClientCount:Integer;  
  57.     function GetMaxClient: Integer;  
  58.     procedure SetMaxClient(const Value: Integer);  
  59.   
  60.   
  61.   protected  
  62.     procedure DoRevData(stream:TMemoryStream);  
  63.     procedure DoClientConnected(socket:TSocket);  
  64.     //取得某个套接字的IP地址   
  65.     function GetItemIP(index:Integer):PAnsiChar;  
  66.   
  67.     function GetItemActived(index:Integer):Boolean;  
  68.     procedure SetItemActived(index:Integer;const Value:Boolean);  
  69.   
  70.   public  
  71.     //ACallHandle:调用者的句柄, CreateSuspended:线程是否挂起   
  72.     constructor Create(ACallHandle:HWND;CreateSuspended: Boolean);overload;  
  73.     //启用监听   
  74.     function ListenStart:Boolean;  
  75.     //执行线程   
  76.     procedure ResumeThread;  
  77.   
  78.     property Host : AnsiString read FHost write FHost;  
  79.     property Port : Integer read FPort write FPort;  
  80.     property MaxClientCount : Integer read GetMaxClientCount write SetMaxClientCount;  
  81.   
  82.     property OnClientConnected : TClientConnected read FOnClientConnected write FOnClientConnected;  
  83.     property OnGetData : TGetDataEvent read FOnGetData write FOnGetData;  
  84.     property ClientSocketList : TStringList read FClientSocketList;  
  85.     property IP[index: Integer] : PAnsiChar read GetItemIP;  
  86.     property ItemActived[index: Integer] : Boolean read GetItemActived write SetItemActived;  
  87.   
  88.     property ClientCount : Integer read GetClientCount write FClientCount;  
  89.     property ClientIndex : Integer read FClientIndex;  
  90. end;  
  91.   
  92.   TWorkThread = class(TThread)  
  93.     private  
  94.       //临界   
  95.       FLock : TCriticalSection;  
  96.       FSocketServer : TSocketServer;  
  97.   
  98.       procedure Execute;override;  
  99.       procedure ReciveFromClient;  
  100.     public  
  101.       constructor Create(ASocketServer:TSocketServer;CreateSuspended: Boolean);overload;  
  102.   end;  
  103.   
  104.   TServerItem = class  
  105.     private  
  106.       FSocket : TSocket;  
  107.       FIP : PAnsiChar;  
  108.       FActived : Boolean;  
  109.     public  
  110.       property Socket : TSocket read FSocket write FSocket;  
  111.       property IP : PAnsiChar read FIP write FIP;  
  112.       property Actived : Boolean read FActived w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值