大概有100个客户端,一个服务器,采用TCP连接,下面这样写一个高手说不对,说下面写的不叫多线程,实现不了100个客户端与服务器通信的。请教,该怎么改进?以下代码是服务器端程序。客户端只发送数据。
我测试了2个客户端与这个服务器端通信,服务器端界面上能收到不同客户端发送过来的数据啊,但是没有环境测试多个客户端与服务器端通信。
private void ServerForm_Load(object sender, EventArgs e)
{
//测试线程
Thread SoceketTestThread = new Thread(new ThreadStart(StartListening));
SoceketTestThread.Start();
//实例化
Set_Text = new set_Text(set_ListViewCarFlowText);
} /// <summary>
/// 开启端口监听线程
/// </summary>
private void StartListening()
{
listener = new TcpListener(IPAddress.Parse(m_serverIP), int.Parse(m_serverPort));
listener.Start();
while (StartListeningFlg)
{
try
{
//一旦在该端口号监听到信息,则启动一个新的线程
Socket s = listener.AcceptSocket();
//判断是否处在连接状态中
if (s.Connected == true)
{
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return;
}
}
//停止监听
listener.Stop();
} /// <summary>
/// 开启对客户端信息的接收处理线程
/// </summary>
private void ServiceClient()
{
try
{
while (ServiceClientFlg)
{
Byte[] buffer = new Byte[1024]; //设置该socket为阻止模式
clientsocket.Blocking = true;
//获取客户端IP地址
IPEndPoint ipe = (IPEndPoint)clientsocket.RemoteEndPoint;
//接收二进制byte数据
int intRec = clientsocket.Receive(buffer);
if (intRec < 1)
{
clientsocket.Close();
//委托相关,用以该线程操控主线程上的控件
listViewCarFlow.Invoke(Set_Text, new object[] { "\r\n" + "已经断开连接" });
break;
} //将二进制数据信息转换成字符串型
string strReceiveMessage = System.Text.Encoding.ASCII.GetString(buffer);
//委托相关,用以该线程操控主线程上的控件
listViewCarFlow.Invoke(Set_Text, new object[] { "\r\n" + strReceiveMessage }); //发送到客户端
byte[] bs = Encoding.ASCII.GetBytes("i have recevied from" + strIP);
clientsocket.Send(bs, bs.Length, 0);
}
}
catch (Exception ex)
{
clientsocket.Close();
}
}
我测试了2个客户端与这个服务器端通信,服务器端界面上能收到不同客户端发送过来的数据啊,但是没有环境测试多个客户端与服务器端通信。
private void ServerForm_Load(object sender, EventArgs e)
{
//测试线程
Thread SoceketTestThread = new Thread(new ThreadStart(StartListening));
SoceketTestThread.Start();
//实例化
Set_Text = new set_Text(set_ListViewCarFlowText);
} /// <summary>
/// 开启端口监听线程
/// </summary>
private void StartListening()
{
listener = new TcpListener(IPAddress.Parse(m_serverIP), int.Parse(m_serverPort));
listener.Start();
while (StartListeningFlg)
{
try
{
//一旦在该端口号监听到信息,则启动一个新的线程
Socket s = listener.AcceptSocket();
//判断是否处在连接状态中
if (s.Connected == true)
{
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return;
}
}
//停止监听
listener.Stop();
} /// <summary>
/// 开启对客户端信息的接收处理线程
/// </summary>
private void ServiceClient()
{
try
{
while (ServiceClientFlg)
{
Byte[] buffer = new Byte[1024]; //设置该socket为阻止模式
clientsocket.Blocking = true;
//获取客户端IP地址
IPEndPoint ipe = (IPEndPoint)clientsocket.RemoteEndPoint;
//接收二进制byte数据
int intRec = clientsocket.Receive(buffer);
if (intRec < 1)
{
clientsocket.Close();
//委托相关,用以该线程操控主线程上的控件
listViewCarFlow.Invoke(Set_Text, new object[] { "\r\n" + "已经断开连接" });
break;
} //将二进制数据信息转换成字符串型
string strReceiveMessage = System.Text.Encoding.ASCII.GetString(buffer);
//委托相关,用以该线程操控主线程上的控件
listViewCarFlow.Invoke(Set_Text, new object[] { "\r\n" + strReceiveMessage }); //发送到客户端
byte[] bs = Encoding.ASCII.GetBytes("i have recevied from" + strIP);
clientsocket.Send(bs, bs.Length, 0);
}
}
catch (Exception ex)
{
clientsocket.Close();
}
}
解决方案 »
- 如何利用C#修改HTML文件数据
- 一个连接数据库的应用程序,要从前台程序中接收很多参数的话,有什么容易构建SQL语句的好方法?
- Socket在1分钟之内如果对方没有响应(举例如对方网络不通或者没开机)如何强制自动结束.
- 在C#中有没有xmlhttp这个类
- 如何使 TextBox 和 NumericUpDown 在没有焦点的时候首次点击后自动选中文本?
- 在代码中如何修改Web.Config中的内容?在线等
- C# 如何在字符串后插入书签
- 租房被骗,郁闷..... 散分
- C#中从excel导回数据的问题
- 请教,大侠帮帮忙啊!!!
- Html选择日期JS代码在IE外的浏览器不兼容求助
- 谁知道为什么我导出的excel表格后,打开却是共享模式打开的,好多功能不能用?
{
clientsocket = s;--> clientsocket这里,你这样测试一下:
client A: 连接
client A: 发送消息 ABC
client B: 连接
client B: 发送消息 CBA
client A: 发送消息 DEF