如何用多线程来管理每一个socket client的连接?

ZengXi 2002-11-01 02:05:02
服务器端有一个listener,客户端可能有20个client,
我想对每个client到listener的连接用一个线程来监听,
谁能给我个例子, 谢谢,
分不够可以再开
...全文
121 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZengXi 2002-12-05
  • 打赏
  • 举报
回复
bolar 2002-11-29
  • 打赏
  • 举报
回复
http://www.aspcool.com/lanmu/browse1.asp?ID=879&bbsuser=csharp
可能对你有帮助
LovenDreams 2002-11-29
  • 打赏
  • 举报
回复
在Programming C# 一书中有这个例子
服务器用无限循环来监听客户端的连接,一检测到有客户连接则实例化处理应用的类,若有二十个客户,则实例化20个该类就行了,不用开线程!
ZengXi 2002-11-05
  • 打赏
  • 举报
回复
能否给个例子呢?
sunwindone 2002-11-01
  • 打赏
  • 举报
回复
最好是给出完整代码,客户端和服务器端的,大家检现成的
eshao 2002-11-01
  • 打赏
  • 举报
回复
关注.. 请高手们给出更好的方法.
qf0421 2002-11-01
  • 打赏
  • 举报
回复
你的设计不对,如果client增加,你难道也无止境的增加线程????
最常用的方法是用队列来管理这些socketclient。
xiaolie 2002-11-01
  • 打赏
  • 举报
回复
public class server1 {
...
private void doCmd()
{
while(!terminated)
{
try
{
TcpClient clientSock = tcpListener.AcceptTcpClient();
if (clientSock != null)
{
CmdSession cmdSession = new CmdSession(clientSock, logger);
cmdSession.start();
}
}
catch(Exception e)
{
logger.logMsg("Exception : " + e.ToString());
Thread.Sleep(1000);
}
}
}

public void start()
{
...
try
{
ThreadStart ths = new ThreadStart(doCmd);
Thread th = new Thread(ths);
th.Name = "Work Thread";
th.Start();
}
catch (Exception e)
{
logger.logMsg("doCmd err:" + e.Message + " " + e.ToString());
}
...
}
}


public class CmdSession
{
private KBLogger logger;
private TcpClient clientSock;
private bool terminated = false;
private NetworkStream netStream;
private StreamReader netReader;
private StreamWriter netWriter;
private ArrayList msgLines;

public CmdSession(TcpClient clientSock, KBLogger logger)
{
//
// TODO: Add constructor logic here
//
this.clientSock = clientSock;
this.logger = logger;
msgLines = new ArrayList();
netStream = clientSock.GetStream();
netReader = new StreamReader(netStream);
netWriter = new StreamWriter(netStream);
}

private void recvThreadFunc()
{
while(!terminated)
{
try
{
string cmdLine = netReader.ReadLine();
cmdLine = cmdLine.ToLower().Trim();
if (cmdLine.Equals("quit"))
{
Close();
}
if (cmdLine.IndexOf("list") == 0)
{
string item = cmdLine.Trim().Substring(4).Trim();
if (item.IndexOf("process") == 0)
{
Process[] ps = Process.GetProcesses();
Monitor.Enter(msgLines);
foreach (Process p in ps)
{
msgLines.Add(p.ToString());
}
msgLines.Add("COMMAND OK");
Monitor.Exit(msgLines);
}
}
......
}
catch (Exception e)
{
logger.logMsg("CmdSession.recvThreadFunc: error:" + e.ToString());
netReader.Close();
Thread.Sleep(500);
Close();
}
}
}

private void sendThreadFunc()
{
while(!terminated)
{
Monitor.Enter(msgLines);
foreach(string msgLine in msgLines)
{
netWriter.WriteLine(msgLine);
}
msgLines.Clear();
Monitor.Exit(msgLines);
}
}

public void start()
{
ThreadStart recvTS = new ThreadStart(recvThreadFunc);
Thread recvThread = new Thread(recvTS);
recvThread.Start();

ThreadStart sendTS = new ThreadStart(sendThreadFunc);
Thread sendThread = new Thread(sendTS);
sendThread.Start();
}

public void Close()
{
terminated = true;
clientSock.Close();
}

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧