2012-04-28 121 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?我想我可能会哭泣。 – 2012-04-28 17:47:32

+0

'goto'从循环结束到结束? – Blam 2012-04-28 17:59:01

+0

是的,这样做,但不建议我可以取代它。 – 2012-04-28 18:16:42

回答

1

在服务器代码中,您只需拨打sock = sock.Accept();一次。将此代码移至一个线程并用while(true)包围它。您可能还想在其他线程中处理客户端的请求。

+0

我这样做:线程li =新线程(接受); li.Start(); Thread lis = new Thread(listenning); lis.Start(); ();(sock.Connected){sock = sock.Accept();};}}}} } }但出现一个异常:socket关闭,条件(while(sock.Receive(data)> 0))有问题 – 2012-04-28 19:59:28