2013-01-31 19 views
23

Tôi được giao nhiệm vụ thiết kế một máy chủ TCP/IP khá đơn giản, phải chấp nhận các kết nối từ nhiều máy khách. Nó cần phải được viết bằng C#, và tôi đang sử dụng .NET 4.5. Điều đó nói rằng, tôi không chắc chắn là "trạng thái hiện đại" hiện tại cho khả năng mở rộng máy chủ/máy khách TCP/IP trong .NET 4.5.Viết một máy chủ TCP/IP có khả năng mở rộng cao trong C# 5 với mẫu async/await?

Tôi đã xem bài đăng này: How to write a scalable Tcp/Ip based server. Nhưng điều đó liên quan đến .NET 2.0 và 3.5 và không đề cập đến mẫu async/await.

Tôi có khả năng viết máy chủ theo "cách cũ" ... nhưng tôi muốn biết "cách mới" là gì.

  • Cách tốt nhất để sử dụng các phương pháp Async mới trên Socket, TcpClient hoặc TcpListener để tạo máy chủ có thể mở rộng trong C# là gì?
  • Thực hiện các phương pháp Async mới có tận dụng các cổng hoàn thành I/O không?
  • Bạn có đang sử dụng Trình nghe Socket riêng của mình hiệu quả hơn hoặc các lớp TcpListener/TcpClient có khá tốt không?

EDIT: Các câu hỏi bổ sung.

+3

không có C# 4.5 :) đó là .net 4.5, C# 5 –

+0

Sigh .. thật ngu ngốc. Cảm ơn vì đã sửa tôi. –

+0

Có thể xem http://signalr.net/ – Richard

Trả lời

10

Cách tốt nhất để sử dụng các phương pháp Async mới trên Socket, TcpClient hoặc TcpListener để tạo máy chủ có thể mở rộng trong C# là gì?

Không có phương thức async mới nào trên Socket; các phương thức có tên là *Async trên Socket là một bộ API đặc biệt để giảm mức sử dụng bộ nhớ. TcpClientTcpListener đã nhận được một số phương thức async mới.

Nếu bạn muốn có khả năng mở rộng tốt nhất, có thể bạn đang sử dụng tốt nhất Stephen Toub's custom awaiters for Socket. Nếu bạn muốn mã dễ nhất, có lẽ bạn nên sử dụng TcpClientTcpListener.

Thực hiện các phương pháp Async mới có tận dụng Cổng kết thúc I/O không?

Vâng, giống như hầu hết các API không đồng bộ khác trong BCL. AFAIK, lớp Stream là lớp duy nhất có thể không sử dụng IOCP; tất cả các phương thức khác *Begin/*End/*Async sử dụng IOCP.

Trình xử lý Socket của riêng bạn có hiệu quả hơn hoặc các lớp TcpListener/TcpClient có khá tốt không?

Các lớp học này khá tốt. Stephen Toub có blog post hiệu quả hơn một chút về mặt sử dụng bộ nhớ.

+0

Không liên quan đến câu hỏi, cổng IO Completion là gì? Tôi xin lỗi, VB nền làm cho tôi không đi qua này. Cảm ơn. – shahkalpesh

+0

@StaurtDunkeld đã liên kết bài viết đó ở trên. Tôi nhìn qua nó, và tôi đoán tôi đã không nhận thấy đó là một nỗ lực để tạo ra một người nghe/khách hàng hiệu quả hơn. Tôi đang cố gắng hiểu điều gì làm cho bộ nhớ trở nên hiệu quả hơn. Có phải bạn không cần phải khởi tạo TcpClient và giữ nó xung quanh để quản lý kết nối không? –

+1

@shahkalpesh: [Một cách hiệu quả để xử lý nhiều I/O không đồng bộ] (http://msdn.microsoft.com/en-us/library/aa365198%28v=VS.85%29.aspx). .NET hiện sử dụng một IOCP cho mỗi miền ứng dụng, được gắn vào nhóm luồng. –

0

Với .net4.5 bạn có thể sử dụng từ khóa không đồng bộ/chờ đợi để tạo máy chủ tcp. Đây là mã mẫu. async await tcp server

Nó có thể chấp nhận hơn 10 nghìn kết nối. tcp server

Các vấn đề liên quan