2010-01-06 4 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 –

+1

Добавляя к комментарию Rubens, * nix не позволяет пользователям, кроме root, использовать зарегистрированные порты. Запросы DNS выполняются через порт 53 UDP (TCP для DNS-серверов, выполняющих переводы), 25 для SMTP (электронная почта) и т. Д. Придерживайтесь незарегистрированной области. –

ответ

1

Добавить настройку в программу, так что вы можете изменить порт ...

Свойства проекта -> Настройки вкладка -> создать установку под названием PortNumber, типа Int32 со значением по умолчанию 9999

в вашем коде, получить значение с Properties.Settings.Default.PortNumber


EDIT: Я неверный вопрос. Вы хотите слушать все порты от 1 до 9999 одновременно? Это не имеет смысла, потому что

  1. многие порты в этом диапазоне уже будут использоваться другими процессами
  2. не нужно слушать на столько портов ...

Если вы беспокоитесь о одновременном подключении нескольких пользователей, это не проблема: просто используйте новый поток для обработки каждого входящего соединения и снова вызовите AcceptTcpClient на слушателе в основном потоке.

+0

«вам не нужно прослушивать столько портов» - если вы не 'inetd' :-) – paxdiablo

+0

Я понимаю, что фактически позволяет пользователю на стороне клиента вручную выбрать один номер порта из диапазона 0 - 9999. – lewis

+0

Вам нужно выбрать это на стороне сервера - сервер должен быть уже прослушан для подключения клиента. –

-1

Обычно вы не используете один сервер для прослушивания нескольких портов; это довольно странно. То, что вы делаете, - это принять соединения, а затем передать их для обработки в другом потоке и вернуться к принятию дополнительных подключений.

0

Лучшим вариантом было бы сделать номер порта настраиваемым через application configuration file. Это позволит серверу изменять порты без перекомпиляции.

Насколько код идет, вам просто нужно установить порт для использования здесь:

TcpListener serverSocket = new TcpListener(portFromAppConfig); 

Кроме того, вы не должны использовать порты ниже 1024 - это зарезервированы порты для системных служб. Вы должны придерживаться портов в более высоком диапазоне чисел (в общем).

+0

Где я могу найти файл конфигурации приложения? – lewis

+0

Это будет app.config во время debug и yourprogram.exe.config во время развертывания. См. Ссылку, которую я опубликовал для получения подробной информации. –

Смежные вопросы