C# windows服务中的TCP IP侦听器

C# windows服务中的TCP IP侦听器,c#,windows-services,tcpclient,tcplistener,installutil,C#,Windows Services,Tcpclient,Tcplistener,Installutil,我正在尝试创建一个windows服务,它需要在后台运行并侦听传入的流量(一个普通的TCP侦听器) 我的代码是: private TcpListener server; public void startServer() { // EventLog.WriteEntry(source, "connected on: " + ipAddress.ToString() + " port: " + Service1.Port.ToString()); serve

我正在尝试创建一个windows服务,它需要在后台运行并侦听传入的流量(一个普通的TCP侦听器)

我的代码是:

private TcpListener server;

public void startServer()
    {
       // EventLog.WriteEntry(source, "connected on: " + ipAddress.ToString() + " port: " + Service1.Port.ToString());

        server = new TcpListener(IPAddress.Parse("127.0.0.1"), Service1.Port);

         server.Start();
        while (true)
        {
          var client = server.AcceptTcpClient();


            new Thread(work).Start(client);

        }

 public void work(object client)
    {
        string msg = null;
        var clientLocal = (TcpClient)client;


            using (NetworkStream ns = clientLocal.GetStream())
            using (StreamReader sr = new StreamReader(ns))
            {
            byte[] msgFullArray = new UTF8Encoding(true).GetBytes(msg);
            fs.Write(msgFullArray, 0, msg.Length);
            }
现在,如果你根本不把工作方法看作我每次启动服务时的工作方法,那么每当我尝试在我的工作时间启动它时,它就会冻结:

 var client = server.AcceptTcpClient();
这意味着我的服务永远无法使用线程或我的工作方法。。
我可以从前面的日志中看到,它进入我的while循环,然后在您的
OnStart
方法中暂停服务,您必须实例化一个服务器类

protected override void OnStart(string[] args)
{
  // Create the Server Object ans Start it.
  server = new TCPServer();
  server.StartServer();
}
负责通过创建一个新的
线程来处理与服务器的连接(因此它是一个非阻塞过程)

对于将由
TCPListener
侦听的每个套接字

private void ServerThreadStart()
{
  // Client Socket variable;
  Socket clientSocket = null;
  TCPSocketListener socketListener = null;
  while(!m_stopServer)
  {
    try
    {
      // Wait for any client requests and if there is any 
      // request from any client accept it (Wait indefinitely).
      clientSocket = m_server.AcceptSocket();

      // Create a SocketListener object for the client.
      socketListener = new TCPSocketListener(clientSocket);

      // Add the socket listener to an array list in a thread 
      // safe fashon.
      //Monitor.Enter(m_socketListenersList);
      lock(m_socketListenersList)
      {
        m_socketListenersList.Add(socketListener);
      }
      //Monitor.Exit(m_socketListenersList);

      // Start a communicating with the client in a different
      // thread.
      socketListener.StartSocketListener();
    }
    catch (SocketException se)
    {
      m_stopServer = true;
    }
  }
}

这里是完整的。

不清楚调用的是什么
startServer
。如果您的
OnStart
方法直接调用它,那就是一个问题。正如您所观察到的,
AcceptCpcClient
会一直阻塞,直到客户端出现,但是调用
OnStart
的线程不属于您,您不应该阻塞它。我的OnStart方法调用的是“server.startServer();”,您是对的,但我不知道如何修复它?
private void ServerThreadStart()
{
  // Client Socket variable;
  Socket clientSocket = null;
  TCPSocketListener socketListener = null;
  while(!m_stopServer)
  {
    try
    {
      // Wait for any client requests and if there is any 
      // request from any client accept it (Wait indefinitely).
      clientSocket = m_server.AcceptSocket();

      // Create a SocketListener object for the client.
      socketListener = new TCPSocketListener(clientSocket);

      // Add the socket listener to an array list in a thread 
      // safe fashon.
      //Monitor.Enter(m_socketListenersList);
      lock(m_socketListenersList)
      {
        m_socketListenersList.Add(socketListener);
      }
      //Monitor.Exit(m_socketListenersList);

      // Start a communicating with the client in a different
      // thread.
      socketListener.StartSocketListener();
    }
    catch (SocketException se)
    {
      m_stopServer = true;
    }
  }
}