在c#中打开Socket,允许多个并发访问,并在没有请求挂起时关闭的最好方法

本文关键字:请求 挂起 方法 Socket 访问 并发 许多个 | 更新日期: 2023-09-27 17:54:34

此套接字一次只允许一个套接字连接到服务器上的一个端口。我已经建立了一个静态类,允许多个调用者,但我不确定如何确定何时可以关闭套接字,因为没有更多的未决请求。

这涉及到通过套接字从产权系统检索数据,并有一个将有多个用户的web前端。有时,如果套接字长时间保持打开状态,它将停止响应,这就是为什么我想打开套接字,发送请求,然后关闭它。如果一个请求进入并且套接字已断开连接,则需要重新连接并发送消息,获取响应,并关闭套接字。

public static class SymConnection
{
    private static TcpClient symSocket;
    private static NetworkStream stream;
    private static int _portNumber;
    private static string _hostName;
    private static int commandNumber;
    private static object myLock = "keepThoseSymCmdsInOrder";
    public static string executeCommand(string command)
    {
        incrementCommandCounter();
        lock (myLock)
        {
            Console.WriteLine("ExecCommand {0}", commandNumber);
            if (symSocket == null)
            {
                symSocket = new TcpClient(_hostName, _portNumber);
                symSocket.SendTimeout = 5000;
                symSocket.ReceiveTimeout = 5000;
                stream = symSocket.GetStream();
            }
            string s = sendCommand(command);

            commandNumber--;
            if (commandNumber == 0)
            {
                stream.Close();
                symSocket.Close();
                symSocket = null;
            }
            Console.WriteLine("ExecCmdEnd {0}", commandNumber);
            return s;
        }
    }
    public static void setConnectionParams(string hostName, int portNumber)
    {
        _hostName = hostName;
        _portNumber = portNumber;
    }
    static void incrementCommandCounter()
    {
        object myObj = "Lock Object";
        lock (myObj)
        {
            commandNumber++;
        }
    }
    static string sendCommand(string command)
    {
        if (!symSocket.Connected) return null;
        StringBuilder sb = new StringBuilder();
        command = command + "'n";
        Byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(command.Replace("'0xFF", "'0xFF'0xFF"));
        stream.Write(data, 0, data.Length);
        do
        {
            int input = stream.ReadByte();
            sb.Append((char)input);
        } while (symSocket.Available > 0);
        return sb.ToString();
    }
}

在c#中打开Socket,允许多个并发访问,并在没有请求挂起时关闭的最好方法

有两种套接字:

  1. 监听套接字。它们的目的是只有接受传入的连接。他们不能发送或接收。您可以使用AcceptBeginAccept/EndAccept

  2. 普通套接字。

  3. 通过Connect()或被侦听器套接字接受来建立连接。

一个TCP套接字可以永远不能被多个端点共享。每个连接在本地套接字和远程套接字之间都是唯一的。

所以你的问题有点奇怪,我真的不知道问题是什么。您是服务器(接受连接)还是客户端(与服务器连接)?