2011-12-04 57 views
2

我試圖實現這一個
Server程序具有通過一個根據要求(提供給客戶端沒有計數器值可以被複制)
遞增計數器的客戶端服務器應用程序一個TCP客戶端服務器應用程序 客戶端程序要求服務器程序遞增計數器並獲得增加的值
服務器程序應該能夠一次處理多個客戶端(至少5個)
計數器值應該由所有服務器線程共享(如果有)
實現用C#


我已經實現了t他服務器和客戶端應用程序在單獨的項目。當我開始運行服務器,然後客戶端服務器程序下面的行給出了一個NullReferanceException。

NetworkStream netstream = ((TcpClient)client).GetStream(); 

我是C#的新手。我想知道客戶端如何連接到服務器並獲得遞增的值。 我在這裏附上我的代碼。 在此先感謝。

MyServer.cs

public abstract class MyServer 
    { 

     private static int port = 8080; 
     private static TcpListener listener; 
     private static Thread thread; 
     private static int clientId = 0; 

     static void Main(string[] args) 
     { 

      listener = new TcpListener(new IPAddress(new byte[] {127,0,0,1}),port); 
      thread = new Thread(new ThreadStart(Listen)); 
      thread.Start(); 
     } 


     private static void Listen() 
     { 
      listener.Start(); 
      Console.WriteLine("Listening on: " + port.ToString()); 

      while(true) 
      { 
       Console.WriteLine("Waiting for connection...."); 
       Console.WriteLine("Client No: " + clientId); 
       TcpClient client = listener.AcceptTcpClient(); 
       Thread listenThread = new Thread(new ParameterizedThreadStart(ListenThread)); 
       listenThread.Start(); 
      } 
     } 

     private static void ListenThread(Object client) 
     { 

       NetworkStream netstream = ((TcpClient)client).GetStream(); 
       Console.WriteLine("Request made"); 
       clientId = clientId + 1; 
       // String message = "Hello world"; 
       byte[] resMessage = Encoding.ASCII.GetBytes(clientId.ToString()); 
       netstream.Write(resMessage, 0, resMessage.Length); 
       netstream.Close(); 


     } 
    } 

MyClient.cs

class MyClient 
    { 
     static void Main(string[] args) 
     { 
      TcpClient tcpClient; 
      int port = 8080; 
      NetworkStream stream = null; 

      tcpClient = new TcpClient("127.0.0.1", port); 
      Console.WriteLine("Connection was established...."); 

      stream = tcpClient.GetStream(); 

      Byte[] response = new Byte[tcpClient.ReceiveBufferSize]; 
      stream.Read(response,0,(int)tcpClient.ReceiveBufferSize); 

      String returnData = Encoding.UTF8.GetString(response); 
      Console.WriteLine("Server Response " + returnData); 

      tcpClient.Close(); 
      stream.Close(); 

     } 
    } 

回答

3

你開始不帶參數的線程同時,預計一個(客戶端的TcpStream)。更改此:

listenThread.Start(); 

這樣:

listenThread.Start(client); 

順便說一句,我會打電話給該線程clientThread而非listenThread;該線程不在監聽,它正在參與客戶端。

+0

非常感謝icktoofay :)它的工作 – SriniShine