Delphi Socket 实现编程(3)

本文介绍了Delphi中使用Socket进行网络通信的实现,包括服务端和客户端的创建。服务端涉及Port和服务描述的设置,以及线程模式选择。客户端同样利用线程确保通讯安全。关键点包括线程的建立、Synchronize方法的应用以及TWinSocketStream类在Socket通讯中的作用。
摘要由CSDN通过智能技术生成

1. Socket 定义:

网络上两个程序为了相互通讯运行,构成服务端客户端结构,连接的每一端可称为一个Socket
(或者套接字)。

客户程序可以向服务端Socket 发送请求,服务端收到后处理此请求,然后将处理结果发送给客户端Socket ,从而形成一次应答。如此重复必要次数,就完成了一次通讯

2. 属性

Port:    在哪个端口侦听。
Service: 服务的描述。一般情况下可以设为空;如果是“FTP ”、 “HTTP”、“ Finger ”、“ Time”等公开的协议名,实际侦听 端口会被自动指定为这些公开协议默认的端口。
ServerType: 其中:TServerType = (stNonBlocking, stThreadBlocking); 用于指定线程模式。

              stNonBlocking表示单线程执行

                       stThreadBlocking 表示多线程执行

Address用IP 地址表示,

Host 用计算机名表示。

 

实现服务端
公用库文件(定义了服务端和客户端使用的令牌,客户端也要使用此文件): 

unit FunAndProc; 
 
interface 
 
uses Windows, Classes, SysUtils; 
 
const    
  DefaultPort = 5643 ;                 { 服务器缺省侦听端口} 
  KEY_Clt: Array[1..4] of String =  { 从客户端发出以下令牌} 
    (’AskForFilesName’ ,               { 请求文件名} 
     ’AskForFilesLengt h’,             { 请求文件长度} 
     ’AskForFilesData’ ,               { 请求发送文件} 
     ’WanttoDisConnect ’);             { 文件发送完成,告知服务端连接可以关闭了} 
  KEY_Srv: Array[1..2] of String =  { 从服务端发出以下令牌:} 
    (’Return1’ ,    { 后面跟的是所有文件名,文件名之间用FilesNameSepStr分隔}

         ’Return2’) ;   { 后面跟的是所有文件长度,文件长度之间用FilesLengthSepStr 
                                分隔} 
  FilesNameSepStr = ’| ’; 
  FilesLengthSepStr =  ’,’; 
 
{StringToStrings 将一个字符串转化为字符串列表,转化方法由字符串中的分隔符SepStr 决 
        定} 
function  StringToStrings(SepStr: String; S: String): TStrings; 
 
{ 将字符串列表转化为字符串,由SepStr 分隔} 
function  StringsToString(SepStr: String; Strs: TStrings;   
       GetFileName: Bo olean = False): String; 
 
{ 返回本机的名字} 
function  Get_ComputerName: String; 
 
implementation 
 
function  StringToStrings(SepStr: String; S: String): TStrings; 
var  
  P: Integer ;   
begin 
  Result := TStringLis t.Create; 
  P := Pos(SepStr, S); 
  while P <> 0  do 
  begin 
    Result.Add(Copy(S,  1, P-1)); 
    Delete(S, 1, P-1+L ength(SepStr)); 
    P := Pos(SepStr,S) ; 
  end ; 
  Result.Add(S); 
end ; 
 
function  StringsToString(SepStr: String; Strs: TStrings;  
        GetFileName: Bo olean = False): String; 
var  
  I: Integer; 
begin 
  Result := ’’; 
  for  I := 0  to Strs.Count-1 do

 if not  GetFileName  then 
    Result := Result +  SepStr + Strs[I] 
  else 
    Result := Result +  SepStr + ExtractFileName(Strs[I]); 
  Delete(Result, 1, Le ngth(SepStr)); 
end ; 
 
function  Get_ComputerName: String; 
var  
  iSize: LongWord; 
  ComputerName: PChar; 
begin 
  iSize := MAX_COMPUTE RNAME_LENGTH + 1; 
  GetMem(ComputerName, iSize); 
  GetComputerName(Comp uterName,iSize); 
  Result := ComputerNa me; 
  FreeMem(ComputerName ); 
end ; 
 
end .


服务端主界面程序:

unit UT_DL_SRV; 
 
interface 
 
uses 
  Windows, Messages, S ysUtils, Classes, Controls, Forms, ScktComp,  
          StdCtrls, Com Ctrls ; 
 
type 
  TFM_DL_SRV =  class(TForm) 
    SrvSocket: TServer Socket; 
    sbSRV: TStatusBar; 
    pcSRV: TPageContro l; 
    TabSheet1: TTabShe et; 
    UserInfo: TListVie w; 
    procedure SrvSocketGetThread(Sender: TObject; 
      ClientSocket: TS erverClientWinSocket; 
      var  SocketThread : TServerClientThread
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值