在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();
}
}
有两种套接字:
-
监听套接字。它们的目的是只有接受传入的连接。他们不能发送或接收。您可以使用
Accept
或BeginAccept
/EndAccept
-
普通套接字。
通过
Connect()
或被侦听器套接字接受来建立连接。一个TCP套接字可以永远不能被多个端点共享。每个连接在本地套接字和远程套接字之间都是唯一的。
所以你的问题有点奇怪,我真的不知道问题是什么。您是服务器(接受连接)还是客户端(与服务器连接)?