2014-05-20 76 views
1

下午好,我一直試圖讓一個系統有點像使用convo組合的skype,能夠進入一個組並與其他在線聊天的人聊天組,問題是我不知道如何我可以將這個聊天室分成幾個,並使他們彼此獨立,只有一臺服務器C#使用多客戶端服務器套接字創建聊天室

總的來說,即時嘗試有一個服務器,同時可以保存多人聊天室對話聊天記錄並能夠讀取它

當前代碼我只能用作1個一般聊天室 服務器端:

static void Main(string[] args) 
    { 
     Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Ip); 
     IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 6000); 
     newSocket.Bind(endPoint); 
     newSocket.Listen(10); 
     Console.Write("Waiting...\n"); 
     while (true) 
     { 

      Socket auxSocket = newSocket.Accept(); 
      ThreadLab a = new ThreadLab(auxSocket); 
      Thread novaThread = new Thread(new ThreadStart(a.Connect)); 
      novaThread.Start(); 

     } 
    } 

的ThreadLab類:

private Socket socket; 
     static int nmrUsers = 0; 
     static int indice; 
     static Socket[] listaSockets = new Socket[10]; 
     static ArrayList listaUtilizadores = new ArrayList(); 

     public ThreadLab(Socket s) 
     { 
      socket = s; 
      listaSockets[indice++] = s; 
     } 

     public void Connect() 
     { 
      IPEndPoint aux = (IPEndPoint)socket.RemoteEndPoint; 
      Console.Write("Client " + aux.Address.ToString() + " connected\n"); 
     } 

這將有讀寫器的客戶端:

private static Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Ip); 
     private static ThreadStart tSReader; 
     private static ThreadStart tSWriter; 
     private static Thread tReader; 
     private static Thread tWriter; 
     private static string nome; 
     static void Main(string[] args) 
     { 

      IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6000); 
      tSReader = new ThreadStart(reader); 
      tSWriter = new ThreadStart(writer); 
      tReader = new Thread(tSReader); 
      tWriter = new Thread(tSWriter); 

      try 
      { 
       client.Connect(clientEndPoint); 
      } 
      catch (SocketException e) 
      { 
       Console.WriteLine(e.ToString()); 
       Console.ReadLine(); 
       return; 
      } 
      tReader.Start(); 
      tWriter.Start(); 
     } 
     public static void writer() 
     { 
      string str; 

      byte[] data = new byte[1024]; 

      nome = Console.ReadLine(); 
      data = Encoding.ASCII.GetBytes(nome); 
      client.Send(data, data.Length, SocketFlags.None); 

      do 
      { 
       str = Console.ReadLine(); 
       data = Encoding.ASCII.GetBytes(str); 
       client.Send(data, data.Length, SocketFlags.None); 

      } while (str != "exit"); 

      client.Shutdown(SocketShutdown.Both); 
      tReader.Abort(); 
      client.Close(); 
     } 

     public static void reader() 
     { 
      byte[] data = new byte[1024]; 
      int recv; 
      while (true) 
      { 
       try 
       { 
        recv = client.Receive(data); 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("Erro: " + e.Message); 
        Console.ReadLine(); 
        break; 
       } 

       Console.WriteLine("\n" + Encoding.ASCII.GetString(data, 0, recv)); 

      } 
     } 
    } 

一直有相當一些麻煩,試圖找到我的問題,但沒有解決方案有效,如果有人能幫助我解決這個問題,真的會感覺不舒服:\

回答

0

在服務器端,你應該有一個線程每個聊天室。在這個線程中,你應該有一個線程連接到這個聊天室中的客戶端。聊天室應該是線程安全的客戶端集合...如果您不熟悉併發線程的同步,您可以使用C#中的線程安全集合:http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx 「無需擔心[很多]關於同步」 。

閱讀關於MVC(https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) 它將極大地幫助您設計服務器端。

+0

@TomTom謝謝你的CONSTRUCTIVE評論。請解釋你的觀點。 –

+0

@TomTom啊,這就是爲什麼...看到我沒有意識到這個問題。在架構方面,這篇文章並沒有那麼糟糕:OP需要圍繞MCV模式重新構建架構,以便有辦法處理多個連接。 FWI:如果你來這裏幫助人們:改變你的解釋方式,沒有人知道你的每一個角落,甚至沒有你......所有解決方案都有不同的方法是正常的,所有的解決方案都有優點和缺點:我們在這裏不討論它們爭論和侮辱他們。祝你有美好的一天。 –

+0

你能舉出線程內的線程的例子嗎?即時通訊試圖瞭解,如果你能夠在代碼中告訴我如何做到這一點,那真的很有幫助:\ –