如何将单个客户端连接到多个服务器? [英] How to connect single client to multiple server?

查看:151
本文介绍了如何将单个客户端连接到多个服务器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将单个客户端连接到多个服务器。现在我的客户端只能连接到一台服务器。我制作的代码可以很好地连接到多个服务器。通过不同或相同的端口。但问题是它与两个服务器通信但是当我从服务器向此客户端发送消息时,它只回复第一个服务器一次,并且多次回复到第二个服务器。我不知道它为什么会发生?连接第二个后它是否与第一个服务器断开连接?







这是我的两个服务器连接程序,



  public   partial   class  Form1:表格
{
int counter = 0 ;

public Form1()
{
InitializeComponent();
}

Socket clsock;

private void button1_Click( object sender,EventArgs e)
{
Thread th = new Thread(()= > StartClient());
th.Start();
}


public void StartClient()
{
尝试
{
clsock = new 套接字(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
int port = Convert.ToInt32(txtport.Text);
IPAddress ip = IPAddress.Parse(txtip.Text);
clsock.Connect(ip,port);
counter + = 1 ;
AppendlblData(Convert.ToString(counter)+ Server Connected + clsock.RemoteEndPoint + Environment.NewLine);
线程th = new 线程(()= > ReceiveData());
th.Start();
}
catch {}
}


public void ReceiveData()
{
试用
{
for int i = 0 ; i > = 0 ; i ++)
{
byte [] data = new byte [ 128 ];
clsock.Receive(data);
string dataReceived = Encoding.ASCII.GetString(data);
char [] c = {' * '' $'' !'' @'};

if (dataReceived!= null
{
string res = dataReceived.TrimStart(c);
MessageBox.Show(res);
// SendKeys.SendWait(res);
}
}
}

catch (例外情况)
{
if (clsock.Connected!= true
{
StopClient();
AppendlblData( 从服务器关闭的连接);
}
}
}


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


public void AppendlblData(< span class =code-keyword> string
myval)
{
if (InvokeRequired)
{
this .Invoke( new Action< string>(AppendlblData), new object [] {m​​yval});
return ;
}
richtxtbox.Text + = myval;
}


私有 void button2_Click(< span class =code-keyword> object
sender,EventArgs e)
{
StopClient();
}

public void StopClient()
{
try
{
AppendlblData( 与服务器断开连接 - + clsock.RemoteEndPoint + Environment.NewLine);
clsock.Close();
}
catch {}
}
}

解决方案

',' !'' @'};

if (dataReceived!= null
{
string res = dataReceived.TrimStart(c);
MessageBox.Show(res);
// SendKeys.SendWait(res);
}
}
}

catch (例外情况)
{
if (clsock.Connected!= true
{
StopClient();
AppendlblData( 从服务器关闭的连接);
}
}
}


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


public void AppendlblData(< span class =code-keyword> string
myval)
{
if (InvokeRequired)
{
this .Invoke( new Action< string>(AppendlblData), new object [] {m​​yval});
return ;
}
richtxtbox.Text + = myval;
}


私有 void button2_Click(< span class =code-keyword> object sender,EventArgs e)
{
StopClient();
}

public void StopClient()
{
try
{
AppendlblData( 与服务器断开连接 - + clsock.RemoteEndPoint + Environment.NewLine);
clsock.Close();
}
catch {}
}
}


您正在完成您正在做的事情,但有多个客户端变量,并更新SendDataToApp以将客户端作为变量,而不是全局变量,以便它使用正确的客户端信息来发送数据。



见:

http://stackoverflow.com/questions/3360555/how-to-pass-parameters-to-threadstart-method-in-thread [ ^ ]


I want to connect single client to multiple servers . now my client able to connect to one server only . I made code which works fine to connects to multiple servers. through different or same ports. but the issue is that it comunicates with both servers but when i send message from server to this client it replies to first server only one time and and to 2nd server multiple times. i dont get why it happends ? Is it broke connection with 1st server after connecting second?



here is my program for two server connections ,

public partial class Form1 : Form
   {
       int counter = 0;

       public Form1()
       {
           InitializeComponent();
       }

       Socket clsock;

       private void button1_Click(object sender, EventArgs e)
       {
           Thread th = new Thread(() => StartClient());
           th.Start();
       }


       public void StartClient()
       {
           try
           {
               clsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
               int port = Convert.ToInt32(txtport.Text);
               IPAddress ip = IPAddress.Parse(txtip.Text);
               clsock.Connect(ip, port);
               counter += 1;
               AppendlblData(Convert.ToString(counter) + " Server Connected " + clsock.RemoteEndPoint + Environment.NewLine);
               Thread th = new Thread(() => ReceiveData());
               th.Start();
           }
           catch { }
       }


       public void ReceiveData()
       {
           try
           {
               for (int i = 0; i >= 0; i++)
               {
                   byte[] data = new byte[128];
                   clsock.Receive(data);
                   string dataReceived = Encoding.ASCII.GetString(data);
                   char[] c = { '*', '$', '!', '@' };

                   if (dataReceived != null)
                   {
                       string res = dataReceived.TrimStart(c);
                       MessageBox.Show(res);
                       // SendKeys.SendWait(res);
                   }
               }
           }

           catch(Exception es)
           {
               if (clsock.Connected !=true)
               {
                   StopClient();
                   AppendlblData("Connection closed from Server");
               }
           }
       }


       private void Form1_Load(object sender, EventArgs e)
       {
           MaximizeBox = false;
       }


       public void AppendlblData(string myval)
       {
           if (InvokeRequired)
           {
               this.Invoke(new Action<string>(AppendlblData), new object[] { myval });
               return;
           }
           richtxtbox.Text += myval;
       }


       private void button2_Click(object sender, EventArgs e)
       {
           StopClient();
       }

       public void StopClient()
       {
           try
           {
               AppendlblData("Disconnected from Server -" + clsock.RemoteEndPoint + Environment.NewLine);
               clsock.Close();
           }
           catch { }
       }
   }

解决方案

', '!', '@' }; if (dataReceived != null) { string res = dataReceived.TrimStart(c); MessageBox.Show(res); // SendKeys.SendWait(res); } } } catch(Exception es) { if (clsock.Connected !=true) { StopClient(); AppendlblData("Connection closed from Server"); } } } private void Form1_Load(object sender, EventArgs e) { MaximizeBox = false; } public void AppendlblData(string myval) { if (InvokeRequired) { this.Invoke(new Action<string>(AppendlblData), new object[] { myval }); return; } richtxtbox.Text += myval; } private void button2_Click(object sender, EventArgs e) { StopClient(); } public void StopClient() { try { AppendlblData("Disconnected from Server -" + clsock.RemoteEndPoint + Environment.NewLine); clsock.Close(); } catch { } } }


You do exactly what you are doing, but have multiple client variables, and update SendDataToApp to have client as a variable, not a global so that it uses the correct client info for sending data.

see:
http://stackoverflow.com/questions/3360555/how-to-pass-parameters-to-threadstart-method-in-thread[^]


这篇关于如何将单个客户端连接到多个服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆