2012-04-28 3 views
1

Я хочу протестировать свой сервер, поэтому я запускаю N клиентов на своем компьютере. Проблема в том, что первый клиент работает, но соединения других были потеряны, и их сокеты были немедленно закрыты !!!!!! Любая идея, как я могу решить эту проблему ???Тестирование сервера с помощью сокета

это мой код:

Сервер:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Xml; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.IO; 
using System.Diagnostics; 
namespace server 
{ 
    public partial class server : Form 
    { 
     public static byte[] data; 
     public static byte[] data1; 
     public static Socket sock; 
     public delegate void operation(string s); 
     public delegate void operation2(); 
     public delegate bool verifier(); 
     public server() 
     {InitializeComponent(); 
      this.Show(); 
      sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPAddress adress = IPAddress.Parse("127.0.0.1"); 
      IPEndPoint iep = new IPEndPoint(adress, 4000); 
      EndPoint ep = (EndPoint)iep; 
      sock.Bind(iep); 
      sock.Listen(1000); 
      sock = sock.Accept(); 
      Thread lis = new Thread(listenning); 
      lis.Start(); 
      } 
     public void listenning() 
     { 
      data1 = new byte[1024]; 
      data = new byte[1024]; 
     repeter: 
      while (sock.Receive(data) > 0) 
      { 
       String s = ASCIIEncoding.ASCII.GetString(data); 
       if (this.InvokeRequired) Invoke((operation)effectuer4, s); 
       else effectuer4(s); 
       goto repeter; 
       } 
     } 
     private void effectuer(String s) 
     { 
      textBox1.Text += "serveur: " + s + "\r\n"; 
       message.Text = ""; 
     } 
     private void effectuer4(String s) 
     { 
      textBox1.Text += "Client: " + s + "\r\n"; message.Text = ""; 
     } 
     private void buttonDisconnect_Click(object sender, EventArgs e) 
     { 
      sock.Close(); 
      Application.Exit(); 
      } 
    private void buttonSend_Click(object sender, EventArgs e) 
     { 
      String s = message.Text ; 
      data1 = System.Text.Encoding.ASCII.GetBytes(s); 
       sock.Send(data1);Invoke((operation)effectuer, s); 
      } 
     } 
    } 

Клиент:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.Sockets; 
using System.IO; 
using System.Diagnostics; 
using System.Threading; 
using System.Net; 
using System.Xml; 
namespace client 
{ 
    public partial class Form1 : Form 
    { 
     public static TcpClient SocketPourClient = null; 
     public static string ClientMessage; 
     public static string ServerMessage; 
     Socket sock; 
     public static byte[] data; 
     public static byte[] data1; 
     public delegate void operation(String s); 
     public delegate void lancer(); 
     public delegate bool verifier(); 
     public IPEndPoint ipEnd = null; 
     public int Num = 1; 
     public Form1(string ip, int port) 
     { 
      InitializeComponent(); 
        IPAddress adress = IPAddress.Parse("127.0.0.1"); 
        ipEnd = new IPEndPoint(adress, 4000); 
        sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
        sock.Connect(ipEnd); 
        Thread th = new Thread(listenning); 
        th.Start(); 
     } 
     public void listenning() 
     { 
      try 
      { 

       data = new byte[1024]; 

      repeter: 
      if (sock.Receive(data) > 0) 
      { 

       String s = ASCIIEncoding.ASCII.GetString(data); 
       if (this.InvokeRequired) Invoke((operation)effectuer4, s); 
       else effectuer4(s); 
       goto repeter; 

      } 
      } 
      catch (SocketException e) 
      { 
       MessageBox.Show(e.ToString()); 
       sock.Close(); 
      } 

     } 


    private void effectuer(String s) 
    { 
     textBox1.Text += "client: " + s + "\r\n"; 
     message.Text = ""; 
    } 
    private void effectuer4(String s) 
    { 
     textBox1.Text += "Server: " + s + "\r\n"; 
     message.Text = ""; 
     } 
private void buttonDisconnect_Click(object sender, EventArgs e) 
    { 
     sock.Close(); 
     Application.Exit(); 
    } 
private void buttonSend_Click_1(object sender, EventArgs e) 
    { 
     String s = message.Text ; 
     data1 = System.Text.Encoding.ASCII.GetBytes(s); 
     sock.Send(data1); 
     Invoke((operation)effectuer, s); 
     } 
    } 
} 

Любая идея, как я могу выполнить N клиентов в одной и той же машине с одной и той же розетке?

+4

Вы используете 'goto's? Я думаю, что могу заплакать. –

+0

'goto', который идет от конца цикла до начала его? – Blam

+0

yes goto сделать это, но я не могу его заменить. –

ответ

1

В код сервера вы вызываете sock = sock.Accept(); только один раз. Переместите этот код в поток и окружите его while(true). Вы также можете обработать запрос клиента в других потоках.

+0

Я делаю это: Thread li = new Thread (accepting); li.Start(); Тема: lis = новая Тема (прослушивание); lis.Start(); } public void accepting() { в то время как (! Sock.Connected) {sock = sock.Accept(); } }, но появилось исключение: socket закрыт и условие (while (sock.Receive (data)> 0)) имеет проблему –

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