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;
inte易做图ce
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;
inte易做图ce
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 ,