读书人

多客户端与一个服务器端的多线程有关问

发布时间: 2013-01-25 15:55:29 作者: rapoo

多客户端与一个服务器端的多线程问题
大概有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();
}
}





[解决办法]
怎么不对,你这是一个客户端开一个socket,那么有多少个中断就有多少个客户端连接,你的那个高手是不是认为在一个进程里开100个线程啊,而不是开100个进程

读书人网 >C#

热点推荐