首先服务端,设置了发给客户端的标题和内容,点击发送按钮,让连接上的客户端进行接收//服务端发送按钮
private void btnsendClient_Click(object sender, EventArgs e)
{
for (int i = 0; i < workerSocketList.Count; i++)
{
if (workerSocket != null)
{
if (workerSocket.Connected)
{
string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
string clientAll = clientTitle + clientInfo;
Net.SendData(workerSocket, clientAll, 10000);
}
}
}
}
客户端接收信息,并把信息的标题和内容分别存放于lblCLientTitle和lblClientInfo中。最后把这两个label的内容放在一个窗体中进行显示。else if (szData.IndexOf("-a",0,szData.Length)==0) //服务端发送过来的用于显示的标题
{
//去掉命令头"-a"
szData = szData.Remove(0,2);
lblClientTitle.Invoke((EventHandler)delegate
{
lblClientTitle.Text = "";
int tempb = szData.IndexOf("-b", 0, szData.Length);
lblClientTitle.Text = szData.Substring(0, tempb);
szData = szData.Remove(0,tempb);
});
if (szData.IndexOf("-b", 0, szData.Length) == 0) //服务端发送过来的用于显示的内容
{
//去掉命令头"-b"
szData = szData.Remove(0, 2);
lblClientInfo.Invoke((EventHandler)delegate
{
lblClientInfo.Text = "";
lblClientInfo.Text = szData;
});
}
private void BrownForm()
{
if ((lblClientTitle.Text.Trim() != "") && (lblClientInfo.Text.Trim() != ""))
{
ShowForm showForm = new ShowForm();
ShowForm.clientTitle = lblClientTitle.Text.Trim();
ShowForm.clientInfo = lblClientInfo.Text.Trim();
showForm.Show();
lblClientTitle.Text = "";
lblClientInfo.Text = "";
}
}问题是,我同时打开多个客户端,所有发送过来的信息都显示在最后一个客户端上。
例如:
服务端发送的标题是777,内容是888如果有三个客户端接入的话,发送过来的内容就成了
标题777
内容888-a777-b888-a777-b888 我想让它们分别显示在不同客户端的相应窗体上!
这个问题已经困扰我两天了,应该不是太难的问题,我就是理不清头绪,请高手赐教!感谢,感谢!
private void btnsendClient_Click(object sender, EventArgs e)
{
for (int i = 0; i < workerSocketList.Count; i++)
{
if (workerSocket != null)
{
if (workerSocket.Connected)
{
string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
string clientAll = clientTitle + clientInfo;
Net.SendData(workerSocket, clientAll, 10000);
}
}
}
}
客户端接收信息,并把信息的标题和内容分别存放于lblCLientTitle和lblClientInfo中。最后把这两个label的内容放在一个窗体中进行显示。else if (szData.IndexOf("-a",0,szData.Length)==0) //服务端发送过来的用于显示的标题
{
//去掉命令头"-a"
szData = szData.Remove(0,2);
lblClientTitle.Invoke((EventHandler)delegate
{
lblClientTitle.Text = "";
int tempb = szData.IndexOf("-b", 0, szData.Length);
lblClientTitle.Text = szData.Substring(0, tempb);
szData = szData.Remove(0,tempb);
});
if (szData.IndexOf("-b", 0, szData.Length) == 0) //服务端发送过来的用于显示的内容
{
//去掉命令头"-b"
szData = szData.Remove(0, 2);
lblClientInfo.Invoke((EventHandler)delegate
{
lblClientInfo.Text = "";
lblClientInfo.Text = szData;
});
}
private void BrownForm()
{
if ((lblClientTitle.Text.Trim() != "") && (lblClientInfo.Text.Trim() != ""))
{
ShowForm showForm = new ShowForm();
ShowForm.clientTitle = lblClientTitle.Text.Trim();
ShowForm.clientInfo = lblClientInfo.Text.Trim();
showForm.Show();
lblClientTitle.Text = "";
lblClientInfo.Text = "";
}
}问题是,我同时打开多个客户端,所有发送过来的信息都显示在最后一个客户端上。
例如:
服务端发送的标题是777,内容是888如果有三个客户端接入的话,发送过来的内容就成了
标题777
内容888-a777-b888-a777-b888 我想让它们分别显示在不同客户端的相应窗体上!
这个问题已经困扰我两天了,应该不是太难的问题,我就是理不清头绪,请高手赐教!感谢,感谢!
一定是客户端请求连接时建立的socket对象没有区分,把建立连接代码贴出来看看就明了了
public static Socket ConnectServer(string ip, int port)
{
Socket s = null;
try
{
IPAddress ipAddress = IPAddress.Parse(ip);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,port);
s = new Socket(ipEndPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
s.Connect(ipEndPoint);
if (s.Connected == false)
s = null;
}
catch (Exception e)
{
Log.WriteLog(e);
}
return s;
}
#endregion客户端的连接代码 #region 连接使用 tcp 协议的服务端
/// <param name="ip">服务端的ip地址</param>
/// <param name="port">服务端的端口号</param>
/// <returns></returns> static
public static Socket ConnectServer(string ip, int port)
{
Socket s = null; try
{
IPAddress ipAddress = IPAddress.Parse(ip);
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Connect(ipEndPoint);
if (s.Connected == false)
{
s = null;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
Log.WriteLog(e);
}
return s;
}
#endregion对于线程分区,请高手举个例子,给个代码参考也好!
{
for (int i = 0; i < workerSocketList.Count; i++)
{
if (workerSocket != null)
{
if (workerSocket.Connected)
{
string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
string clientAll = clientTitle + clientInfo;
Net.SendData(workerSocket, clientAll, 10000);
}
}
}
}你在for (int i = 0; i < workerSocketList.Count; i++)这个地方下断点,看看你发送的目标,当客户端接收到服务端的信息时,每个客户端是同时接受到的是3条回复,他没有区分哪个回复是针对自己的。(你的3个客户端应该是在同一台机器上)。
说明白点就是你克隆3个自己,邮递员有3封信件要给你,可是来到你家,发现有3个一模一样的人,只好每人给
3封同样的信件!
#region "发送至客户端"的信息
private void btnsendClient_Click(object sender, EventArgs e)
{
string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
string clientAll = clientTitle + clientInfo;
Socket sock = null;
for (int i = 0; i < workerSocketList.Count; i++)
{
sock = (Socket)workerSocketList[i];
if (sock != null)
{
if (sock.Connected)
{
Net.SendData(sock, clientAll, 10000);
}
}
}
}
#endregion问题的原因是:所有客户端共用一个socket,导致把消息只发给了最后一个接入的客户端。应该为每个客户端都建立一个socket,就可以了!
还有,LZ有没有订立协议啊,订立协议是个好办法哦