[英]Socket Programming design questions
我正在(第一次)在 C# 中使用 Socket 編程,我正在制作一個類似 Skype 的應用程序(視頻通話、IM、文件共享、屏幕共享),我有幾個問題......
1) 套接字應該如何真正工作? 在客戶端,我有一個有效地保持套接字打開的 while 循環,這是正確的嗎? 或者我應該在每次發送/接收后關閉套接字(我使用 BeginSend() 和 BeginRecieve())並創建一個新套接字? 建立連接后調用interact()。 我的代碼:
private static void interact()
{
try
{
while (true)
{
receive(client);
send(client);
}
}
catch (Exception e)
{
Logging.errorDisconnect(client, e);
}
}
2) 您將如何通過使用 System.Net.Sockets 中的 BeginSend/BegingRecieve 或創建您自己的 Task 實現來設計健壯的客戶端/服務器應用程序?
3) 是否有關於健壯/可擴展應用程序的客戶端/服務器架構的好教程? 我看過 P2P,但我不完全確定它是我需要的。
另外,我試圖避免使用 3rd 方實現,這樣我就可以了解它是如何自己完成的。
提前致謝..
我假設您想要運行持久連接並偶爾向遠程端發送命令。 這通常意味着雙方必須始終運行讀取循環以接收命令。 讀取和寫入之間的交替對於您在此處沒有的請求/回復模型是有意義的(因為雙方都可以發送請求,您可能會將傳入的請求誤認為是預期的回復)。
循環不會使套接字保持活動狀態。 如果你告訴我你為什么認為我可以澄清。 您可以獨立於任何類型的“循環”來決定連接的生命周期。
您想使用哪種調用方式(同步、APM、TAP)不會影響套接字的行為方式或通過線路傳輸的內容。 您可以自由選擇。 套接字超級難搞定,從同步 IO 開始。 異步 IO 相當困難,在這里可能沒有必要。
通常,您應該盡量避免使用套接字,因為它們很難且級別較低。 嘗試使用一些更高級別的 RPC 機制,例如 WCF 或 HTTP。 如果你堅持自定義線格式protobuf 是一個不錯的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.