gpt4 book ai didi

c# - 与localhost C#的双向通信

转载 作者:行者123 更新时间:2023-12-03 12:08:05 25 4
gpt4 key购买 nike

我有一个作为本地主机在后台运行的服务。我需要连接到该服务并开始接收/发送消息。

我可以将整个任务分为3个子任务:

  • 建立通信
  • 分配一个线程(T1),该线程负责从本地主机
  • 接收消息
  • 分配一个线程(T2),该线程负责向本地主机
  • 发送消息

    问题:
    我是否需要一个单独的线程来监视连接? 如果连接丢失(例如,服务崩溃),我可以从 CreateClientConnectionSettings()T1中调用 T2吗?
    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之类的相关连接状态创建自己的枚举(在类之外,但是在相同的 namespace 中,甚至在相同的文件中):

    public enum ConnStatus { CONNECTED, DISCONNECTED, FAULTED };

    然后,您可以创建一个类,该类管理所有套接字,线程,读/写...
    该线程将引发一些事件,例如“messageReceived”和“statusChanged”,它们必须声明为该类的字段:
    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
    }

    关于c# - 与localhost C#的双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059511/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com