เอ็น | 中
三十功名尘与土,八千里路云和月。
'TouchSocket' เป็นเฟรมเวิร์กการสื่อสารเครือข่าย.NET ที่ทรงพลังและใช้งานง่ายสำหรับภาษาต่างๆ เช่น C#, VB.Net และ F# มีโมดูลการสื่อสารที่หลากหลาย รวมถึง TCP, UDP, SSL, WebSocket, Modbus ฯลฯ รองรับการแก้ปัญหาการรับเหมาช่วงแพ็กเก็ต TCP และการรวมส่วนย่อยของแพ็กเก็ตขนาดใหญ่ UDP กรอบงานรองรับเทมเพลตโปรโตคอลที่หลากหลายเพื่อแยกวิเคราะห์แพ็กเก็ตข้อมูลอย่างรวดเร็ว เช่น ส่วนหัวคงที่ ความยาวคงที่ และอักขระช่วงเวลา
IOCP ของ TouchSocket ไม่เหมือนกับแบบเดิม เพียงใช้ตัวอย่างอย่างเป็นทางการของ Microsoft เป็นตัวอย่าง เขาใช้ MemoryBuffer เพื่อเปิดหน่วยความจำ แบ่งเท่า ๆ กัน จากนั้นกำหนดโซนให้กับแต่ละเซสชันที่จะรับ จากนั้น คัดลอก ข้อมูลที่ได้รับ จากนั้นประมวลผลข้อมูลที่คัดลอก TouchSocket คือการนำบล็อกหน่วยความจำที่ใช้งานได้จากพูลหน่วยความจำก่อนการรับแต่ละครั้ง จากนั้นใช้โดยตรงเพื่อรับ และหลังจากได้รับข้อมูลแล้ว บล็อกหน่วยความจำจะถูกโยนออกไปเพื่อการประมวลผลโดยตรง เพื่อหลีกเลี่ยง การดำเนินการคัดลอก แม้ว่า มันเป็นเพียงการออกแบบขนาดเล็ก แต่เมื่อส่งข้อมูล 10w คูณ 64kb ความแตกต่างด้านประสิทธิภาพคือ 10 เท่า
ผมเชื่อว่าทุกคนเคยใช้ผลิตภัณฑ์ Socket อื่นๆ ดังนั้น TouchSocket จึงได้รับการออกแบบให้เรียนรู้จากแนวคิดการออกแบบที่ยอดเยี่ยมของผลิตภัณฑ์อื่นๆ อะแดปเตอร์ประมวลผลข้อมูลก็เป็นหนึ่งในนั้น แต่อะแดปเตอร์ของ TouchSocket ต่างจากการออกแบบผลิตภัณฑ์อื่นๆ ตรงที่มีพลังมากกว่าและ ใช้งานง่าย. และมีความยืดหยุ่น ไม่เพียงแต่สามารถแยกวิเคราะห์แพ็กเก็ตล่วงหน้าเท่านั้น แต่ยังสามารถแยกวิเคราะห์ออบเจ็กต์ข้อมูล ซึ่งสามารถแทนที่ได้ตลอดเวลาและมีผลทันที ตัวอย่างเช่น คุณสามารถใช้ส่วนหัวของแพ็กเก็ตคงที่เพื่อประมวลผลข้อมูลล่วงหน้า เพื่อแก้ปัญหาการรับเหมาช่วงข้อมูลและแพ็กเก็ตเหนียว นอกจากนี้ยังสามารถแยกวิเคราะห์โปรโตคอลข้อมูล HTTP, โปรโตคอลข้อมูล WebSocket ฯลฯ ได้โดยตรง
TouchSocket มีโมเดลเฟรมเวิร์กที่หลากหลายและเข้ากันได้อย่างสมบูรณ์กับโปรโตคอลทั้งหมดที่ใช้โปรโตคอล TCP และ UDP ตัวอย่างเช่น TcpService และ TcpClient มีฟังก์ชันพื้นฐานเหมือนกับ Sockets แต่จะปรับปรุงความทนทานและการทำงานพร้อมกันของเฟรมเวิร์ก และส่งต่อการเชื่อมต่อและข้อมูลที่ได้รับในรูปแบบของเหตุการณ์ เพื่อให้ผู้ใช้สามารถใช้งานได้ง่ายขึ้น
ต่อไปนี้เป็นเพียงตัวอย่างง่ายๆ ของวิธีสร้างตัวอย่าง โปรดดูรายละเอียดเพิ่มเติมในเอกสารประกอบ
TcpService service = new TcpService();
service.Connecting = (client, e) => {return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => {return EasyTask.CompletedTask; };//有客户端连接
service.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//有客户端断开连接
service.Received = (client, e) =>
{
//Received information from the client
string mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
Console.WriteLine($"Removed from {client. ID} Message received: {}");
return EasyTask.CompletedTask;
};
await service.StartAsync(7789);//Start
TcpClient tcpClient = new TcpClient();
tcpClient.Connected = (client, e) => {return EasyTask.CompletedTask; };//Successfully connected to the server
tcpClient.Disconnected = (client, e) => {return EasyTask.CompletedTask; };//Disconnect from the server, which is not triggered when the connection is unsuccessful.
tcpClient.Received = (client, e) =>
{
//Information is received from the server
string mes = e.ByteBlock.Span.ToString(Encoding.UTF8);
Console.WriteLine($"Message received: {mes}");
return EasyTask.CompletedTask;
};
await tcpClient.ConnectAsync("127.0.0.1:7789");
await tcpClient.SendAsync("Hello");
ในการกำหนดค่าปลั๊กอินของ Config คุณสามารถใช้ปลั๊กอินการเชื่อมต่อใหม่ได้
.ConfigurePlugins(a=>
{
a.UseReconnection(5, true, 1000);
});
อะแดปเตอร์ส่วนใหญ่แก้ปัญหาการติดและการบรรจุ Tcp และรูปแบบข้อมูลใช้โหมด "Baotou + Data Body" ที่เรียบง่ายและมีประสิทธิภาพซึ่ง Baotou รองรับ:
ส่วนหัวข้อมูลด้านบนทั้งหมดใช้โหมดด้านข้างเริ่มต้น (โหมด little-end) ของ TouchSocketBitConverter และผู้ใช้สามารถสลับโหมดด้านข้างเริ่มต้นได้ตามความต้องการ
TouchSocketBitConverter.DefaultEndianType = EndianType.Little;
อะแดปเตอร์ส่วนหัวคงที่ที่ผู้ใช้กำหนดส่วนใหญ่ช่วยให้ผู้ใช้แก้ไขข้อมูลเฟรมข้อมูลด้วยส่วนหัวคงที่ ตัวอย่างเช่น รูปแบบข้อมูลต่อไปนี้จำเป็นต้องใช้อินเทอร์เฟซเพียงไม่กี่รายการเท่านั้นในการแยกวิเคราะห์ โปรดดูรายละเอียดที่ API
|1|1|1|**********|
อะแดปเตอร์ส่วนหัวที่ไม่คงที่ที่ผู้ใช้กำหนดส่วนใหญ่จะช่วยให้ผู้ใช้แก้ปัญหาข้อมูลเฟรมข้อมูลที่มีส่วนหัวที่ไม่ได้รับการแก้ไข ตัวอย่างเช่น แพ็กเก็ต HTTP ทั่วไปส่วนใหญ่มีส่วนหัวข้อมูลที่แยกออกจากเนื้อหาข้อมูลด้วย "rn" และส่วนหัวข้อมูลไม่ได้รับการแก้ไขเนื่องจากข้อมูลคำขอที่แตกต่างกันของผู้ร้องขอ และความยาวของเนื้อหาข้อมูลคือ นอกจากนี้ ยังระบุอย่างชัดเจนด้วยค่าของ ContentLength ของส่วนหัวข้อมูล ดังนั้นคุณจึงสามารถพิจารณาใช้ CustomUnfixedHeaderDataHandlingAdapter เพื่อแยกวิเคราะห์ ซึ่งสามารถทำได้ผ่านการพัฒนาแบบง่ายๆ เช่นกัน
ขอบคุณสำหรับการสนับสนุน TouchSocket หากคุณมีคำถามอื่น ๆ โปรดส่งปัญหาหรือเข้าร่วมกลุ่ม QQ: 234762506 เพื่อหารือ
ขอบคุณการสนับสนุนของเครื่องมือดังต่อไปนี้
เพิ่มโครงการ TouchSocket ให้กับองค์กร dotNET China แล้ว