簡體   English   中英

與 localhost C# 的雙向通信

[英]Two-way Communication with localhost C#

我有一項服務在后台作為 localhost 運行。 我需要連接到該服務並開始接收/發送消息。

我可以將整個任務分為 3 個子任務:

  1. 建立溝通
  2. 分配一個線程(T1),負責從本地主機接收消息
  3. 分配一個線程(T2),負責向本地主機發送消息

問題:我需要一個單獨的線程來監控連接嗎? 或者我可以從T1T2調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM