2016-08-23 32 views
0

我试图创建一个需要在后台运行,并侦听传入通信窗口服务IP监听器(一个正常和常规TCP监听)TCP在Windows服务

我的代码是:

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(); 

意味着我的服务永远不会用苏氨酸EAD或我的工作方法.. 我可以从以前的记录看,它进入我的while循环,然后就超时服务

+0

不清楚什么叫'startServer'。如果它是由你的'OnStart'方法直接调用的,那就是一个问题。正如你所看到的,'AcceptTcpClient'阻塞直到出现一个客户端,但OnStart被调用的线程*不属于你*,你不应该阻塞它。 –

+0

那么你是正确的,我的onstart方法调用 “server.startServer();” 但我不知道我明白如何解决它呢? – Pilsneren

回答

1

在你OnStart方法,你必须实例化一个服务器类。

protected override void OnStart(string[] args) 
{ 
    // Create the Server Object ans Start it. 
    server = new TCPServer(); 
    server.StartServer(); 
} 

,其负责通过创建处理对服务器的连接的新Thread(因此它是一个无阻塞处理),它将由一个被监听的每个插座

public void StartServer() 
{ 
    if (m_server!=null) 
    { 
    // Create a ArrayList for storing SocketListeners before 
    // starting the server. 
    m_socketListenersList = new ArrayList(); 

    // Start the Server and start the thread to listen client 
    // requests. 
    m_server.Start(); 
    m_serverThread = new Thread(new ThreadStart(ServerThreadStart)); 
    m_serverThread.Start(); 

    // Create a low priority thread that checks and deletes client 
    // SocktConnection objcts that are marked for deletion. 
    m_purgingThread = new Thread(new ThreadStart(PurgingThreadStart)); 
    m_purgingThread.Priority=ThreadPriority.Lowest; 
    m_purgingThread.Start(); 
    } 
} 

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; 
    } 
    } 
} 

这里是完整的project article

+0

谢谢你,我的好先生! – Pilsneren