帮忙看看CS模式下的服务器端疑难问题

哈哈潜伏哥 2010-07-25 04:23:24
情况是这样的,最近我做的服务器端程序出现很怪异的问题,运行久了以后由于服务器与客户端通讯的线程过多就死机了。这个问题困扰我好几天了,这几天天天通宵的搞也找不到问题的原因。请各位大侠帮忙一下,小弟万分感激。解决问题后小弟将另开一贴,送上200分,以表谢意,绝无虚言。
服务器监听线程代码如下:

private void DoListen()
{
listenerCar = new TcpListener(IPAddress.Parse(serverip), int.Parse(Tools.CarPort));
listenerCar.Start();

while (true)
{
try
{
Socket ss = listenerCar.AcceptSocket();
RevCar = new Thread(new ParameterizedThreadStart(RevCarInfo));
SocketThread st = new SocketThread(ss, RevCar);
RevCar.Start(st);
RevCar.sta
//ThreadPool.QueueUserWorkItem(new WaitCallback(RevCarInfo),ss); //这里试过用线程池结果还是因为通信线程不断增加而死机了
CheckOnline();//查询在线客户端

}
catch(Exception err)
{
Tools.WriteTxtLog("监听主线程:\r\n" + err.ToString());
}
}
}


服务器与客户端通讯线程代码:

private void RevInfo(object obj)
{
SocketThread soct = (SocketThread)obj;
Socket tempsocket1 = soct.Sock;
DateTime dtt = DateTime.Now;
int i;
try
{
bool keepalive = true;
while (keepalive)
{
ArrayList arrbyte = new ArrayList();
Byte[] buffer = new Byte[1024]; //接收缓冲区 1024字节
if (tempsocket1.Connected)
{

if (tempsocket1.Poll(-1, SelectMode.SelectRead))//1000000*60
{
int bytenum = tempsocket1.Receive(buffer);
if (bytenum == 0)
{
keepalive = false;
CloseSocket(soct.Sock);
//AbortThread(soct.Pthread);
CheckOnlineCar();
break;
}
else
{
int datalength = ConvertDataLength(buffer[1], buffer[2]);
string DataInfo = System.Text.Encoding.ASCII.GetString(buffer, 0, bytenum).Trim();

string HeradInfo = DataInfo.Substring(3, 2);
SetText(HeradInfo);
switch (HeradInfo)
{
case "AS":
if (DataInfo.Substring(datalength - 1, 1) == "#")
{
for (i = 0; i < datalength; i++)
{
if (i != 1 & i != 2)
{
arrbyte.Add(buffer[i]);
}
}
byte[] ww = (byte[])(arrbyte.ToArray(typeof(System.Byte)));

byteayy(ww, tempsocket1, soct.Pthread);
arrbyte.Clear();
}
break;

case "eM":

break;
case "eG":

break;

case "AS":

break;
default:

break;

}
}
}
else
{
keepalive = false;
CheckOnline();
CloseSocket(soct.Sock);
//AbortThread(soct.Pthread);
break;
}
if (!keepalive)
{
CloseSocket(tempsocket1);
//AbortThread(soct.Pthread);
CheckOnlineCar();
break;
}
}
else
{
keepalive = false;
//AbortThread(soct.Pthread);
CloseSocket(tempsocket1);
CheckOnlineCar();
break;
}
}
}
catch (Exception ee)
{
CloseSocket(tempsocket1);
CheckOnlineCar();
}
}

请各位大侠帮忙看看小弟的代码是不是有什么明显的错误或者小弟我写的程序本身就有很大问题。
主要现象为,服务器端的运行的线程(主要是与客户端通信的线程有时在客户端断开后不能自己终止运行)不断的增加,最后增加到1500个线程左右,内存也不停的增加,最后耗尽资源而死机了。
小弟编程水平有限,写的出代码比较粗糙,见笑了。
...全文
257 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveSoftandhxy 2010-08-04
  • 打赏
  • 举报
回复
找到终极的解决方案,即使发出,我们一直在关注!!
哈哈潜伏哥 2010-08-04
  • 打赏
  • 举报
回复
问题还是被我自己在10天以前解决了,不过还是感谢各位的积极回答。现在程序已经连续运行超过10多天了,没有任何问题,内存占有才200MB。
解决办法是:我另外添加了一个线程来专门检测所有的SOCKET连接,并自己定义了一个类,加上SOCKET的活动时间属性,每次SOCKET收到数据后就改写一次最后活动时间,然后在新加的线程中定时检测活动时间,如果超过一定的时间,则强行断开连接并终止通讯线程。这样这个问题就迎刃而解了。但我觉得这个解决方案并不是太好,有一些缺陷。但我目前还有找到终极的解决方案。
嗷嗷叫的老马 2010-07-26
  • 打赏
  • 举报
回复
没使用的连接要释放

另外......一个线程就一个连接,是不是太浪费了点?连接一多,那线程还不给开上天去?
loveSoftandhxy 2010-07-26
  • 打赏
  • 举报
回复
我这边最近也有这个问题,端口监听的时候,不断的增加线程连接数。。。我们最近也在研究这个问题,看看有没有高手能帮忙看看的。。跟LZ一样,等待高手给出方案。
phpc 2010-07-26
  • 打赏
  • 举报
回复
代码太多了,知道原因就应该好办了,
upc_xiaowei 2010-07-26
  • 打赏
  • 举报
回复
我是来回帖拿分的,我好歹也是有脸面的人,现在居然混到靠回帖来赚可用分的地步,真是csnd的悲剧啊
hyblusea 2010-07-26
  • 打赏
  • 举报
回复
帮顶.....
zgke 2010-07-26
  • 打赏
  • 举报
回复
太长了..没自己看 只是看你IF里都有BREAK 那为什么还要WHILE(TRUE)呢
哈哈潜伏哥 2010-07-25
  • 打赏
  • 举报
回复
还有人来吗?
哈哈潜伏哥 2010-07-25
  • 打赏
  • 举报
回复
麻烦各位仔细帮小弟看一下啊,连wuyq11大侠都来了,看来这问题比较严重啊。最好帮忙看一下代码有什么问题没
teerhu 2010-07-25
  • 打赏
  • 举报
回复
wangxiao2008 2010-07-25
  • 打赏
  • 举报
回复
可以用异步委托的方式试一下,BeginInvoke要有对应的EndInvoke
一下开那么多线程没试过。
wuyq11 2010-07-25
  • 打赏
  • 举报
回复
连接用完了,就断开连接
通过一些耗时操作放到多线程中
超时控制机制,多线程模式
chowyi 2010-07-25
  • 打赏
  • 举报
回复
我爱C#
wenbin 2010-07-25
  • 打赏
  • 举报
回复
你把业务部分拿出来,别跟接收数据放在一块呀,看着代码好长呢。
wenbin 2010-07-25
  • 打赏
  • 举报
回复
你在客户端加入发心跳机制,服务端做一个检查线程,当在一定时间内收不到心跳包,就主动关闭该连接。
哈哈潜伏哥 2010-07-25
  • 打赏
  • 举报
回复
怎么没有人会吗,高手快来看看啊

111,094

社区成员

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

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

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