簡體   English   中英

打開 Socket、允許多個並發訪問以及在 C# 中沒有更多請求掛起時關閉的最佳方法

[英]Best way to open a Socket, allow multiple concurrent access, and close when no more requests pending in C#

此套接字一次只允許一個套接字連接到服務器上的一個端口。 我已經構建了一個 static class 允許多個調用者,但我不確定如何確定何時可以關閉套接字,因為沒有更多的掛起請求。

這涉及通過 sockets 從專有系統檢索數據,並且具有將有多個用戶的 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();
    }
}

sockets有兩種類型:

  1. 聽 sockets。 這些的目的只是接受傳入的連接。 他們無法發送或接收。 您在這些上使用AcceptBeginAccept / EndAccept

  2. 常規 sockets。 通過Connect()或被監聽器 sockets 接受來建立連接。

一個 TCP 插座永遠不能被多個端點共享。 本地套接字和遠程套接字之間的每個連接都是唯一的。

因此你的問題有點奇怪,我真的不知道問題是什么。 您是服務器(接受連接)還是客戶端(連接服務器)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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