TClientSocket 類管理 TCP/IP客戶端 Socket連接, 繼承於 TObject->TPersistent->TComponent->TAbstractSocket->TCustomSocket.
屬性:
1. property ClientType: TClientType;
客戶端Socket是否讀寫Socket同步連接時信息.
type TClientType = (ctNonBlocking, ctBlocking);
非阻塞方式: 當客戶端連接服務器時, 會自動保持連接;
阻塞方式: 需要多線程方式響應客戶端;
2. property Socket: TClientWinSocket;
客戶端Socket連接節點
3. property Active: Boolean;
是否打開連接
4. property Address: string;
Server端 IP 地址. Socket打開時不可設置
5. property Host: string;
Server端名稱, 類似: http://www.wSite.Com . Socket打開時不可設置
6. property Port: Integer;
Sever端的 Port ID.打開時不可設置
7. property Service: string;
Socket連接的服務類型名稱. 如:ftp, http, finger, and time. Socket打開時不可設置
一般地, Port 已經即指示出服務類型.
方法:
1. procedure Close;
關閉 Socket 連接. 設置 Active=False.
2. procedure Open;
打開 Socket 連接. 設置 Active=True;
一個通過Socket響應服務器的線程執行示例:
procedure TMyClientThread.Execute;
var
TheStream: TWinSocketStream;
buffer: string;
begin
// 創建一個 TWinSocketStream 進行Socket 讀寫
TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
try
// 獲取並處理命令指定連接或者線程終止
while (not Terminated) and (ClientSocket1.Active) do
begin
try
GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }
// 寫向服務器的請求
TheStream.Write(buffer, Length(buffer) + 1);
// 讀從服務器發來的數據的處理
...
except
if not(ExceptObject is EAbort) then
Synchronize(HandleThreadException); // 必須使用異常處理
end;
end;
finally
TheStream.Free;
end;
end;
procedure TMyServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
// 當連接Ok時
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0); // 初始化 buffer
// 給定客戶端 60秒時間開始寫
if Stream.WaitForData(60000) then
begin
if Stream.Read(Buffer, 10) = 0 then // 如果60s時間內沒有讀取到數據
ClientSocket.Close; // 關閉連接
// 其它處理
...
end
else
ClientSocket.Close; // 客戶端沒有開始
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;
TServerSocket 類管理 TCP/IP客戶端 Socket連接, 繼承於 TObject->TPersistent->TComponent->TAbstractSocket->TCustomSocket->TCustomServerSocket.
屬性:
1. property Socket: TServerWinSocket;
監聽連接端的 TServerWinSocket 對象;
示例:
procedure TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_Return then // 回車
if IsServer then // 是 Server or Client , 則發送最近Memo中輸入的一行字符串.
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
else
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
end;
2. property ServerType: TServerType;
Sever端連接方式 : 非阻塞方式, 線程阻塞方式
type TServerType = (stNonBlocking, stThreadBlocking);
3. property ThreadCacheSize: Integer;
可以重用於客戶端連接的線程最大數 , 默認值為 10. 用於線程阻塞方式.
4. property Active: Boolean;
打開連接
5. property Port: Integer;
連接端口
6. property Service: string;
服務類型
方法:
1. procedure Close;
關閉連接
2. procedure Open;
打開連接