当前位置:编程学习 > Delphi >>

Delphi Socket 实现编程(3)

1. Socket 定义:

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

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

2. 属性

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

              stNonBlocking表示单线程执行

                       stThreadBlocking 表示多线程执行

Address用IP 地址表示,

Host 用计算机名表示。

 

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


[delphi]
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 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;
 
implementat

补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,