2013-12-03 1 views
0

Итак, я столкнулся с проблемой, я создал сервер, который обрабатывает один клиент, и теперь я хочу поднять его с надписью и обработать несколько клиентов на одном время. Я посмотрел и попытался сделать это, используя HashTables, а также Async, но я все время зацикливаюсь, это серая область для меня, поскольку я только недавно начал заниматься сокетами и т. Д. Я задавался вопросом, имел ли кто-нибудь способ Делать это? Любые советы будут приняты на борту. Это мой код сервера (если это помогает).Изменение одного клиентского сервера на несколько серверов C#

namespace ChatServer 
{ 

    delegate void UpdateTextBox(string msg); 
    public partial class Form1 : Form 
    { 
     private TcpListener ConnectionListener; 
     private BinaryReader MessageReader; 
     private BinaryWriter MessageWriter; 
     private Socket ClientConnection; 
     private NetworkStream DataStream; 
     private Thread ListeningThread; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      try 
      { 
       IPAddress.Parse(textBox3.Text);// 
       ListeningThread = new Thread(new ThreadStart(ListenForConnections)); 
       ListeningThread.Start(); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("Wrong Ip Address"); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 

      try 
      { 
       if (ClientConnection.Connected) 
       { 
        MessageWriter.Write(textBox2.Text); 
        textBox2.Clear(); 
       } 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("no client is connected"); 
      } 
     } 

     private void textBox2_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 

       try 
       { 
        if (ClientConnection.Connected) 
        { 
         MessageWriter.Write(textBox2.Text); 
         textBox2.Clear(); 
        } 
       } 
       catch (Exception) 
       { 
        MessageBox.Show("no client is connected"); 
       } 
      } 
     } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      System.Environment.Exit(System.Environment.ExitCode); 
     } 

     private void ListenForConnections() 
     { 

      try 
      { 
       ConnectionListener = new TcpListener(IPAddress.Parse(textBox3.Text), 80); 
       ConnectionListener.Start(); 
       ChangeTextBoxContent("Listening For Connections"); 
       ClientConnection = ConnectionListener.AcceptSocket(); 
       DataStream = new NetworkStream(ClientConnection); 
       MessageReader = new BinaryReader(DataStream); 
       MessageWriter = new BinaryWriter(DataStream); 
       ChangeTextBoxContent("Connection Received"); 
       HandleConnection(); 
       MessageReader.Close(); 
       MessageWriter.Close(); 
       DataStream.Close(); 
       ClientConnection.Close(); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("Unable to connect, wrong ip address"); 
      } 
     } 
     private void HandleConnection() 
     { 
      string message; 

      do 
      { 

       try 
       { 
        message = MessageReader.ReadString(); 
        ChangeTextBoxContent(message); 
       } 
       catch (Exception) 
       { 
        ChangeTextBoxContent("connection Lost"); 
        break; 
       } 
      } while (true); 
     } 
     private void ChangeTextBoxContent(string tx) 
     { 
      if (textBox1.InvokeRequired) 
      { 
       Invoke(new UpdateTextBox(ChangeTextBoxContent), new object[] { tx }); 
      } 
      else 
      {  
       textBox1.Text += tx + "\r\n"; 
      } 
     } 

    } 
} 

Заранее спасибо.

ответ

1

Вы должны обрабатывать каждое из своих соединений в отдельном потоке. Создайте цикл, который постоянно прослушивает удаленные подключения, и когда вызывается удаленное соединение, создайте новый поток с соединением в качестве параметра объекта.

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

  • Нет связанных вопросов^_^