2012-04-28 1 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

はい、これを行うが、私はそれを置き換えることはお勧めしません。 –

答えて

1

サーバーコードでは、sock = sock.Accept();を1回だけ呼び出します。このコードをスレッドに移動し、while(true)で囲みます。他のスレッドでクライアントの要求を処理することもできます。

+0

私はこれを行います:スレッドli =新しいスレッド(受け入れ); li.Start(); スレッドlis =新しいスレッド(listenning); lis.Start(); } public void accepting(){ while(!sock.Connected){sock = sock.Accept(); } }例外が発生しました。ソケットがクローズされ、条件(while(sock.Receive(data)> 0))に問題があります –

関連する問題