2010-01-06 144 views
0

我現在使用默認端口號TcpListener serverSocket = new TcpListener(9999); ,但因爲在我的客戶端,我已經把一個文本框,以允許用戶手動鍵入端口號。那麼,如何讓我的服務器端,允許端口號從端口1至9999,而不是服務器端口號

using System; 
using System.Threading; 
using System.Net.Sockets; 
using System.Text; 
using System.Collections; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    public static Hashtable clientsList = new Hashtable(); 

    static void Main(string[] args) 
    { 
     TcpListener serverSocket = new TcpListener(9999); 
     TcpClient clientSocket = default(TcpClient); 
     int counter = 0; 

     serverSocket.Start(); 
     Console.WriteLine("Welcome to NYP Chat Server "); 
     counter = 0; 
     while ((true)) 
     { 
      counter += 1; 
      clientSocket = serverSocket.AcceptTcpClient(); 

      byte[] bytesFrom = new byte[10025]; 
      string dataFromClient = null; 

      NetworkStream networkStream = clientSocket.GetStream(); 
      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 

      clientsList.Add(dataFromClient, clientSocket); 

      broadcast(dataFromClient + " Connected ", dataFromClient, false); 

      Console.WriteLine(dataFromClient + " has join the chat room "); 
      handleClinet client = new handleClinet(); 
      client.startClient(clientSocket, dataFromClient, clientsList); 
     } 

     clientSocket.Close(); 
     serverSocket.Stop(); 
     Console.WriteLine("exit"); 
     Console.ReadLine(); 
    } 

    public static void broadcast(string msg, string uName, bool flag) 
    { 
     foreach (DictionaryEntry Item in clientsList) 
     { 
      TcpClient broadcastSocket; 
      broadcastSocket = (TcpClient)Item.Value; 
      NetworkStream broadcastStream = broadcastSocket.GetStream(); 
      Byte[] broadcastBytes = null; 

      if (flag == true) 
      { 
       broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg); 
      } 
      else 
      { 
       broadcastBytes = Encoding.ASCII.GetBytes(msg); 
      } 

      broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length); 
      broadcastStream.Flush(); 
     } 
    } //end broadcast function 
}//end Main class 


public class handleClinet 
{ 
    TcpClient clientSocket; 
    string clNo; 
    Hashtable clientsList; 

    public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList) 
    { 
     this.clientSocket = inClientSocket; 
     this.clNo = clineNo; 
     this.clientsList = cList; 
     Thread ctThread = new Thread(doChat); 
     ctThread.Start(); 
    } 

    private void doChat() 
    { 
     int requestCount = 0; 
     byte[] bytesFrom = new byte[10025]; 
     string dataFromClient = null; 
     Byte[] sendBytes = null; 
     string serverResponse = null; 
     string rCount = null; 
     requestCount = 0; 

     while ((true)) 
     { 
      try 
      { 
       requestCount = requestCount + 1; 
       NetworkStream networkStream = clientSocket.GetStream(); 
       networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
       dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
       dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
       Console.WriteLine("From client - " + clNo + " : " + dataFromClient); 
       rCount = Convert.ToString(requestCount); 

       Program.broadcast(dataFromClient, clNo, true); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 
     }//end while 
    }//end doChat 
    } //end class handleClinet 
}//end namespace 
+3

您應該限制端口大於1024:http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers – 2010-01-06 02:26:30

+1

添加到Rubens註釋中,* nix不會讓root以外的用戶使用註冊端口。 DNS請求通過端口53 UDP(TCP用於執行傳輸的DNS服務器),25用於SMTP(電子郵件)等。粘貼到未註冊的區域。 – 2010-01-06 02:29:26

回答

1

設置添加到您的程序,這樣就可以更改端口...

項目屬性 - >設置選項卡 - >創建一個名爲PORTNUMBER Int32類型的設置,與9999

默認值在代碼中,有Properties.Settings.Default.PortNumber


編輯檢索值:我誤解了這個問題。你想同時聽1到9999的所有端口嗎?它沒有任何意義,因爲

  1. 在這個範圍內許多港口都已經被其他進程
  2. 你不需要聽這麼多的端口上,...

如果你擔心有多個用戶同時連接,這不是一個問題:只使用一個新的線程來處理每個傳入的連接,並在主線程上的聽衆再次呼籲AcceptTcpClient

+0

「你不需要聽這麼多端口」 - 除非你'inetd' :-) – paxdiablo 2010-01-06 02:41:10

+0

嗯我的意思是,居然讓在客戶端用戶從範圍內數手動選擇1端口號0 - 9999。 – lewis 2010-01-06 03:31:56

+0

您需要在服務器端選擇此項 - 服務器必須已經偵聽客戶端進行連接。 – 2010-01-06 17:16:32

-1

你通常沒有一個單一的服務器偵聽多個端口;這很奇怪。你所做的是接受連接,然後將它們傳遞給另一個線程進行處理,然後返回到接受更多連接。

0

最好的辦法是使通過application configuration file自定義的端口號。 這將允許服務器更改端口而無需重新編譯。

至於代碼的話,你只需要設置的端口用在這裏:

TcpListener serverSocket = new TcpListener(portFromAppConfig); 

而且,你不應該使用的端口低於1024 - 這些被保留端口的系統服務。你應該堅持更高範圍的數字(一般來說)端口。

+0

哪裏可以找到應用程序配置文件? – lewis 2010-01-06 03:30:58

+0

它將在調試期間爲app.config,在部署時爲yourprogram.exe.config。請參閱我發佈的鏈接瞭解詳細信息。 – 2010-01-06 17:19:38