TCP

2016-08-23 4 views
0

は、私がバックグラウンドで実行され、着信トラフィックをリッスンする必要があるWindowsサービスを作成しようとしているWindowsサービスでIPリスナー(通常、通常のTCPリスナー)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); 
      } 

今はまったく私は私でそれを起動しようとするたびに、それがフリーズ私のサービスを起動するたびなどの作業方法を見ていない場合:私のサービスはThrでを使用するために取得することはありません意味

var client = server.AcceptTcpClient(); 

eadまたは私の仕事方法.. 以前のログから私のループを入力してからサービスをタイムアウトすることがわかります

+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