12/09/2021 (เวอร์ชัน 3.1)
25/05/2021 (เวอร์ชัน 3.0)
13/03/2021 (เวอร์ชัน 2.6)
02/01/2021 (เวอร์ชัน 2.5)
12/18/2020 (เวอร์ชั่น 2.4)
28/11/2020
31/10/2020 (เวอร์ชั่น 2.3)
27/10/2020 (เวอร์ชัน 2.2)
26/10/2020 (เวอร์ชัน 2.1)
10/09/2020
10/06/2020
09/24/2020
16/07/2020
07/12/2020
05/03/2020
04/19/2020
03/31/2019
ส่วนประกอบเหล่านี้ช่วยให้คุณสร้างการสื่อสารแบบอะซิงโครนัส TCP Socket ระหว่างคอมพิวเตอร์บนเครือข่าย LAN หรืออินเทอร์เน็ต
DzTCPServer และ DzTCPClient ใช้ TClientSocket และ TServerSocket ของหน่วย System.Win.ScktComp คลาสเหล่านี้มีอยู่ใน Delphi แต่ใช้งานยากนิดหน่อยเนื่องจากคุณจำเป็นต้องอ่านและเขียนข้อมูลบัฟเฟอร์ และมีทรัพยากรไม่มากนัก
การใช้งานนั้นง่ายมาก คุณจะต้องวางส่วนประกอบเซิร์ฟเวอร์บนแอปฝั่งเซิร์ฟเวอร์และส่วนประกอบไคลเอ็นต์บนแอปฝั่งไคลเอ็นต์ และเริ่มเขียนโค้ดข้อความคำสั่ง
คุณสามารถทำสิ่งต่างๆ ได้มากมาย เช่น แอปแชท แอปคำสั่งระยะไกล แอปตรวจสอบระยะไกล และแม้กระทั่งส่งสตรีม เช่น ไฟล์ ท้องฟ้าคือขีดจำกัด
โครงสร้างแคช : เมื่อคุณใช้ส่วนประกอบซ็อกเก็ตดั้งเดิมของ Delphi หากคุณส่งข้อความหลายข้อความพร้อมกัน ผู้รับอาจได้รับข้อความที่จัดกลุ่มหรือแบ่ง ดังนั้นคุณจึงต้องจัดการกับปัญหานี้อยู่เสมอ DzSocket ควบคุมข้อความซ็อกเก็ตโดยอัตโนมัติ ดังนั้นคุณจะได้รับหนึ่งเหตุการณ์ต่อข้อความเสมอ
KeepAlive : เมื่อคุณสร้างการเชื่อมต่อซ็อกเก็ต หากการเชื่อมต่อด้านหนึ่งขาดหายไป อีกด้านจะไม่ได้รับการสื่อสารจนกว่าจะพยายามส่งข้อความใหม่ ดังนั้นคุณสามารถใช้การ ping ด้วยตนเองได้ แต่จะทำให้มีงานที่ไม่จำเป็นมากมาย DzSocket มีทรัพยากร KeepAlive ซึ่งเปิดใช้งานโปรโตคอล Keep-alive แบบเนทีฟของเครือข่าย
คำสั่ง : ซ็อกเก็ตดั้งเดิมช่วยให้คุณส่งเซ็กเมนต์สตริงได้ แต่ถ้าคุณต้องการส่งคำสั่งและระบุคำสั่งนี้ในอีกด้านหนึ่งของการเชื่อมต่อ คุณจะต้องดำเนินการด้วยตนเอง ด้วย DzSocket คุณจะมีคำสั่ง Char อยู่เสมอ พร้อม รวดเร็วและง่ายดาย
ออบเจ็กต์ข้อมูลอิสระอัตโนมัติบนเซิร์ฟเวอร์ : รายการออบเจ็กต์ไคลเอ็นต์ที่มีอยู่ในส่วนประกอบเซิร์ฟเวอร์มีคุณสมบัติตัวชี้ ซึ่งช่วยให้คุณสามารถจัดเก็บข้อมูลเกี่ยวกับการเชื่อมต่อไคลเอ็นต์ ซึ่งโดยปกติจะใช้ออบเจ็กต์ ด้วย DzSocket คุณไม่จำเป็นต้องกังวลเกี่ยวกับการทำลายวัตถุนี้ คุณเพียงแค่ต้องเปิดใช้งานคุณสมบัติเพื่อดูแลออบเจ็กต์เหล่านี้
ตัวแจงนับ : คอมโพเนนต์เซิร์ฟเวอร์ดั้งเดิมไม่มีตัวแจงนับเพื่อวนซ้ำการเชื่อมต่อรายการไคลเอนต์ การใช้ DzSocket ช่วยให้คุณสามารถทำ for .. in
องค์ประกอบเซิร์ฟเวอร์ได้โดยตรง โดยวนซ้ำการเชื่อมต่อรายการไคลเอนต์
SendAll : ส่งคำสั่งไปยังไคลเอนต์ทั้งหมดได้อย่างง่ายดาย นอกจากนั้น คุณสามารถใช้ SendAllEx
เพื่อส่งคำสั่งไปยังไคลเอนต์ทั้งหมด ยกเว้นการเชื่อมต่อไคลเอนต์เฉพาะ
การตรวจสอบการเชื่อมต่อ : มีเหตุการณ์การเชื่อมต่อที่หายไปซึ่งช่วยให้คุณทราบเมื่อการเชื่อมต่อถูกปิดโดยไม่ต้องร้องขอจากไคลเอ็นต์
การสนับสนุน Unicode : ส่วนประกอบดั้งเดิมของ Delphi ไม่รองรับการส่งข้อความโดยใช้สตริง Unicode เว้นแต่คุณจะเขียนโค้ดของคุณเองเพื่อแปลงสตรีมข้อมูลทั้งสองด้าน มันน่าเบื่อมากและต้องใช้เวลา การใช้ DzSocket ทำให้คุณสามารถส่งข้อความโดยใช้พารามิเตอร์เมธอดโดยตรงเป็นประเภทสตริง ดังนั้น Delphi จะพิจารณาอักขระ Unicode เป็น WideString ตามค่าเริ่มต้น
การควบคุมการเข้าสู่ระบบ : คุณสามารถควบคุมการรับรองความถูกต้อง/การอนุญาตไคลเอ็นต์ได้โดยใช้เหตุการณ์ธรรมดา และคุณสามารถส่งข้อมูลพิเศษเพื่อควบคุมการเข้าถึงเซิร์ฟเวอร์ของลูกค้าได้
การเชื่อมต่อใหม่อัตโนมัติ : ส่วนประกอบไคลเอนต์สามารถเชื่อมต่อใหม่กับเซิร์ฟเวอร์โดยอัตโนมัติเมื่อการเชื่อมต่อขาดหาย เพียงแค่เปิดใช้งานคุณสมบัติ
และอีกมากมาย!
รองรับ Delphi XE3..เดลฟี 11
AutoFreeObjs: Boolean
(สาธารณะ) = หากคุณใช้คุณสมบัติ Data
ของซ็อกเก็ตไคลเอนต์บนเซิร์ฟเวอร์เพื่อกำหนดวัตถุ คุณอาจเปิดใช้งานตัวเลือกนี้ ดังนั้นส่วนประกอบจะดูแลการทำลายวัตถุเมื่อซ็อกเก็ตไคลเอนต์สิ้นสุดลง โปรดจำไว้ว่า หากเปิดใช้งานตัวเลือกนี้และกำหนดคุณสมบัติ Data ของซ็อกเก็ต ส่วนประกอบจะถือว่า Data เป็นออบเจ็กต์เสมอ
EnumeratorOnlyAuth: Boolean
(public) = เมื่อใช้ตัวแจงนับส่วนประกอบ for in
ไคลเอ็นต์บายพาสที่ยังไม่ผ่านการรับรองความถูกต้อง
KeepAlive: Boolean
= อนุญาตให้เปิดใช้งานทรัพยากรดั้งเดิมของซ็อกเก็ต KeepAlive สิ่งนี้จะส่งสัญญาณ Keep-alive โดยใช้คุณสมบัติ KeepAliveInterval
KeepAliveInterval: Integer
= ระบุช่วงเวลา KeepAlive เป็นมิลลิวินาที (ค่าเริ่มต้น 15000 / 15 วินาที )
Port: Word
= ระบุเซิร์ฟเวอร์ฟังพอร์ต TCP คุณสมบัตินี้จำเป็นเพื่อเริ่มซ็อกเก็ตเซิร์ฟเวอร์
Connection[Index: Integer]: T DzSocket
(สาธารณะ) = ส่งคืนอ็อบเจ็กต์การเชื่อมต่อไคลเอ็นต์ T DzSocket ตามดัชนี
Count: Integer
(สาธารณะ) = ส่งคืนจำนวนรายการการเชื่อมต่อไคลเอนต์
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
เหตุการณ์นี้เกิดขึ้นเมื่อไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์ พารามิเตอร์ Socket
คือซ็อกเก็ตไคลเอ็นต์
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
เหตุการณ์นี้เกิดขึ้นเมื่อไคลเอ็นต์ตัดการเชื่อมต่อจากเซิร์ฟเวอร์ พารามิเตอร์ Socket
คือซ็อกเก็ตไคลเอ็นต์
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อเกิดข้อผิดพลาดในการเชื่อมต่อไคลเอนต์ พารามิเตอร์ Socket
คือซ็อกเก็ตไคลเอ็นต์
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
เหตุการณ์นี้เกิดขึ้นเมื่อไคลเอ็นต์ส่งข้อความไปยังเซิร์ฟเวอร์ พารามิเตอร์ Socket
คือซ็อกเก็ตไคลเอ็นต์
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อไคลเอนต์เพิ่งเชื่อมต่อกับเซิร์ฟเวอร์ หากที่ฝั่งไคลเอ็นต์ OnLoginRequest
ได้รับการจัดการ ข้อมูลข้อมูลที่ส่งจะถูกรับที่นี่ในพารามิเตอร์ RequestData
คุณสามารถเปลี่ยนพารามิเตอร์ Accept
(ค่าเริ่มต้นคือ True) เพื่อยอมรับหรือปฏิเสธการเชื่อมต่อไคลเอนต์ นอกจากนั้น คุณสามารถใช้พารามิเตอร์ ResponseData
เพื่อส่งข้อมูลบางอย่างไปยังไคลเอนต์ได้ ลูกค้าจะได้รับข้อมูลค่าสถานะและข้อมูลข้อมูลที่ยอมรับในเหตุการณ์ OnLoginResponse
หากพารามิเตอร์ Accept
ยังคงเป็น True คุณสมบัติ socket Auth
จะถูกตั้งค่าเป็น True มิฉะนั้นการเชื่อมต่อไคลเอ็นต์จะถูกตัดโดยเซิร์ฟเวอร์
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
เหตุการณ์นี้จะถูกทริกเกอร์ทันทีหลังจากที่ไคลเอ็นต์ได้รับอนุญาตให้เข้าสู่เซิร์ฟเวอร์ แม้ว่าคุณจะไม่ได้ใช้กิจกรรมการเข้าสู่ระบบ โปรดจำไว้ว่า: หลังจากที่ไคลเอนต์ได้รับอนุญาตให้เข้าสู่เซิร์ฟเวอร์แล้วเท่านั้น ไคลเอนต์จึงสามารถส่งข้อความได้ มิฉะนั้นเซิร์ฟเวอร์จะเพิกเฉยต่อข้อความไคลเอนต์
procedure Open ;
เปิดพอร์ตซ็อกเก็ตการฟังของเซิร์ฟเวอร์
procedure Close ;
ปิดพอร์ตซ็อกเก็ตการฟังของเซิร์ฟเวอร์
procedure Lock ;
procedure Unlock ;
ใช้วิธีการเหล่านี้เพื่อวนซ้ำรายการการเชื่อมต่อ (เธรดที่ปลอดภัย) เนื่องจากการเชื่อมต่ออาจถูกปิดเมื่อคุณกำลังวนซ้ำรายการการเชื่อมต่อ
ตัวอย่าง:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
นอกจากนี้ ส่วนประกอบ TDzTCPServer ยังมีตัวแจงนับเริ่มต้นที่ชี้ไปที่รายการการเชื่อมต่อ ส่งผลให้วัตถุ T DzSocket ดังนั้นคุณจึงสามารถวนซ้ำรายการการเชื่อมต่อโดยใช้คำสั่ง
for .. in
ได้เหมือนกับตัวอย่างก่อนหน้านี้
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
ส่งคำสั่งและข้อความไปยังซ็อกเก็ตไคลเอ็นต์ที่ระบุโดยพารามิเตอร์ Socket
คุณควรใช้พารามิเตอร์ Cmd
เพื่อระบุอักขระคำสั่งที่ไคลเอ็นต์จะได้รับ พารามิเตอร์ A
เป็นทางเลือก และอนุญาตให้คุณระบุข้อความได้
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
ส่งข้อความไปยังไคลเอนต์ที่ได้รับการรับรองความถูกต้องทั้งหมด
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
ส่งข้อความไปยังไคลเอ็นต์ที่ได้รับการรับรองความถูกต้องทั้งหมด ยกเว้นไปยังไคลเอ็นต์ที่ระบุโดยพารามิเตอร์ Exclude
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
ส่งกลับวัตถุ T DzSocket โดย Socket Handle ID
function GetAuthConnections : Integer;
ดึงข้อมูลการเชื่อมต่อที่ได้รับการรับรองความถูกต้องเท่านั้น
AutoReconnect: Boolean
= หากเปิดใช้งาน เมื่อไคลเอนต์ขาดการเชื่อมต่อกับเซิร์ฟเวอร์ ซ็อกเก็ตจะพยายามเชื่อมต่อใหม่โดยอัตโนมัติ
AutoReconnectInterval: Integer
= ระบุเวลาเป็นมิลลิวินาทีเพื่อรอความพยายามในการเชื่อมต่อใหม่ (ค่าเริ่มต้น 10,000 / 10 วินาที )
AutoReconnectAttempts: Integer
= จำนวนครั้งในการพยายามเชื่อมต่อใหม่หลังจากการเชื่อมต่อขาดหาย ปล่อยค่า 0
ไว้เพื่อลองอีกครั้งอย่างไม่สิ้นสุด
KeepAlive: Boolean
= อนุญาตให้เปิดใช้งานทรัพยากรดั้งเดิมของซ็อกเก็ต KeepAlive สิ่งนี้จะส่งสัญญาณ Keep-alive โดยใช้คุณสมบัติ KeepAliveInterval
KeepAliveInterval: Integer
= ระบุช่วงเวลา KeepAlive เป็นมิลลิวินาที (ค่าเริ่มต้น 15000 / 15 วินาที )
Host: String
= ระบุ IP หรือชื่อโฮสต์ (DNS) เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ คุณสมบัตินี้จำเป็นในการเชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์
Port: Word
= ระบุพอร์ต TCP การเชื่อมต่อไคลเอ็นต์ซึ่งเซิร์ฟเวอร์กำลังฟังหรือพอร์ตถูกแมป คุณสมบัตินี้จำเป็นในการเชื่อมต่อกับซ็อกเก็ตเซิร์ฟเวอร์
Connected: Boolean
(สาธารณะ) = คืนค่าเป็นจริงหากสร้างการเชื่อมต่อแล้ว
SocketHandle: TSocket
(สาธารณะ) = ส่งกลับ Socket Handle ID ของการเชื่อมต่อ
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อไคลเอนต์สร้างการเชื่อมต่อกับเซิร์ฟเวอร์
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
เหตุการณ์นี้เกิดขึ้นเมื่อการเชื่อมต่อขาดหายไประหว่างไคลเอนต์และเซิร์ฟเวอร์ สิ่งนี้จะเกิดขึ้นหากไคลเอนต์ตรวจพบว่าการเชื่อมต่อถูกปิดโดยไม่มีคำสั่งตัดการเชื่อมต่อโดยไคลเอนต์เอง
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อไคลเอนต์ยกเลิกการเชื่อมต่อจากเซิร์ฟเวอร์ แม้ว่าการเชื่อมต่อจะหายไปก็ตาม WasConnected
ช่วยให้คุณทราบว่าเหตุการณ์ OnDisconnect มาจากการเชื่อมต่อที่สร้างขึ้นหรือไม่ เนื่องจากเหตุการณ์นี้จะเริ่มทำงานแม้ว่าคุณจะพยายามเชื่อมต่อและการเชื่อมต่อไม่สำเร็จก็ตาม
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อเกิดข้อผิดพลาดในการเชื่อมต่อไคลเอนต์ ขอแนะนำให้ตั้งค่าเหตุการณ์นี้เสมอ ไม่เช่นนั้นส่วนประกอบจะทำให้เกิดข้อผิดพลาดแบบอะซิงโครนัสที่ไม่สามารถควบคุมได้
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
เหตุการณ์นี้เกิดขึ้นเมื่อไคลเอนต์ได้รับข้อความจากเซิร์ฟเวอร์
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
เหตุการณ์นี้จะถูกทริกเกอร์ทันทีหลังจากที่ไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์ หมายความว่าเซิร์ฟเวอร์กำลังขอข้อมูลข้อมูลการเข้าสู่ระบบ ดังนั้นจึงสามารถตรวจสอบข้อมูลนี้และเลือกยอมรับหรือยกเลิกการเชื่อมต่อไคลเอ็นต์ คุณควรกรอกพารามิเตอร์ Data
หากคุณต้องการจัดการข้อมูลนี้บนเซิร์ฟเวอร์
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
เหตุการณ์นี้เกิดขึ้นเมื่อเซิร์ฟเวอร์ยอมรับหรือปฏิเสธการเชื่อมต่อไคลเอ็นต์ คุณสามารถตรวจสอบผลลัพธ์นี้ได้ในพารามิเตอร์ Accepted
และเซิร์ฟเวอร์อาจส่งข้อมูลข้อมูลบางส่วนไปยังพารามิเตอร์ Data
ให้กับลูกค้า
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
เกิดขึ้นเมื่อเปิดใช้งานคุณสมบัติ AutoReconnect
อัตโนมัติ และการเชื่อมต่อขาดหายไป หลังจากช่วงเวลามิลลิวินาที AutoReconnectInterval
หากความพยายามในการเชื่อมต่อใหม่ล้มเหลว เหตุการณ์จะถูกทริกเกอร์อย่างต่อเนื่องจนกว่าจะมีการเชื่อมต่อเกิดขึ้น คุณสามารถยกเลิกความพยายามในการเชื่อมต่อใหม่ได้โดยการเปลี่ยนคุณสมบัติ Cancel
เป็น True
ในเหตุการณ์การเชื่อมต่อใหม่ หรือการเรียกวิธี StopReconnection
procedure Connect ;
เชื่อมต่อกับเซิร์ฟเวอร์
procedure Disconnect ;
ตัดการเชื่อมต่อจากเซิร์ฟเวอร์
procedure StopReconnection ;
หยุดความพยายามในการเชื่อมต่อใหม่เมื่อเปิดใช้งาน AutoReconnect
อัตโนมัติและการเชื่อมต่อขาดหาย
procedure Send ( const Cmd: Char; const A: String = ' ' );
ส่งคำสั่งและข้อความไปยังเซิร์ฟเวอร์ คุณควรใช้พารามิเตอร์ Cmd
เพื่อระบุอักขระคำสั่งที่เซิร์ฟเวอร์จะได้รับ พารามิเตอร์ A
เป็นทางเลือก และอนุญาตให้คุณระบุข้อความได้
สิ่งสำคัญ: เซิร์ฟเวอร์จะไม่ได้รับข้อความในขณะที่ไคลเอ็นต์ยังไม่ผ่านการรับรองความถูกต้อง แม้ว่าจะเชื่อมต่ออยู่แล้วก็ตาม
มีเฉพาะใน Delphi XE6 หรือสูงกว่าเท่านั้น
เมื่อคุณใช้วิธี Send
จากเซิร์ฟเวอร์หรือซ็อกเก็ตไคลเอนต์ จะมีพารามิเตอร์ String
ที่อนุญาตให้คุณส่งข้อมูลได้ มีสองวิธีทั่วโลกที่คุณสามารถใช้เพื่อส่งข้อมูลหลายรายการพร้อมกัน:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
ผู้ส่ง:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
ผู้รับ:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
ฟังก์ชันการแปลงใช้ JSON ภายในเพื่อให้แน่ใจว่าอักขระส่วนต่างๆ จะถูกหลีกหนี เพื่อให้แน่ใจว่าอาร์เรย์จะแพ็ก/คลายแพ็กโดยไม่มีการเปลี่ยนแปลงเนื้อหา ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับเนื้อหาของชิ้นส่วนประเภทตัวเลือก
โปรดตรวจสอบแอปพลิเคชันสาธิตและดูคำสั่ง Send Print เพื่อทราบวิธีการส่งและรับสตรีมข้อมูล และยังใช้การบีบอัดเพื่อเพิ่มความเร็วในการสื่อสาร