[英]Two-way Communication with localhost C#
我有一項服務在后台作為 localhost 運行。 我需要連接到該服務並開始接收/發送消息。
我可以將整個任務分為 3 個子任務:
問題:我需要一個單獨的線程來監控連接嗎? 或者我可以從T1
和T2
調用CreateClientConnectionSettings()
以防連接丟失(例如,在服務崩潰的情況下)
IPHostEntry ipHost;
IPAddress ipAddr;
IPEndPoint localEndPoint;
Socket clientSocket;
private void CreateClientConnectionSettings()
{
// Establish the remote endpoint for the socket.
//This example uses port 11111 on the local computer.
ipHost = Dns.GetHostEntry(Dns.GetHostName());
ipAddr = ipHost.AddressList[0];
localEndPoint = new IPEndPoint(ipAddr, 11111);
// Creation TCP/IP Socket using Socket Class Costructor
clientSocket = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
// Connect Socket to the remote endpoint using method Connect()
clientSocket.Connect(localEndPoint);
UpdateConnectionStatusLabel( "Connected");
//connectionStatusLabel.ForeColor = Color.Green;
isConnected = true;
}
// Manage of Socket's Exceptions
catch (ArgumentNullException ane)
{
UpdateConnectionStatusLabel("ArgumentNullException" + ane.ToString());
}
catch (SocketException se)
{
UpdateConnectionStatusLabel("SocketException " + se.ToString());
}
catch (Exception e)
{
UpdateConnectionStatusLabel("Unexpected exception : " + e.ToString());
}
}
PS: C# 中是否有此功能的內置類?
根據我有限的經驗,從不同的線程訪問同一個套接字是一個非常危險的想法,但假設你正在做的是一個 GUI 客戶端應用程序,我的建議是創建一個建立連接的線程,當有東西到達時創建事件從套接字並從隊列發送數據。
要對連接狀態進行編碼,您可以為相關連接狀態(如 CONNECTED 和 DISCONNECTED)創建自己的枚舉(在 class 之外,但在同一個命名空間中,甚至在同一個文件中):
public enum ConnStatus { CONNECTED, DISCONNECTED, FAULTED };
然后,您可以創建一個 class 來管理所有套接字、線程、讀/寫...線程將引發一些事件,如“messageReceived”和“statusChanged”,它們必須聲明為 class 的字段:
public delegate void StringEventHandler(string param);
public StringEventHandler messageReceived;
public delegate void ConnStatusEventHandler(ConnStatus param);
public ConnStatusEventHandler statusChanged;
然后在線程中你可以像這樣觸發它們:
try {
clientSocket.Connect(localEndPoint);
statusChanged?.Invoke(ConnStatus.CONNECTED);
while(runThread){
// Send messages in queue
string RX = String.Empty;
//READ from Socket
//perform some basic checks if needed
messageReceived?.Invoke(RX);
}
statusChanged?.Invoke(ConnStatus.DISCONNECTED);
catch {
statusChanged?.Invoke(ConnStatus.FAULTED);
}
finally {
//perform some cleanup
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.