请教一个有关P2P中线程被无故中止的事例!

angeryman 2004-08-16 12:13:00
小弟最近写了一个有关通信的程序,但是只要一发消息过后,其中的监听线程会被系统中止,至今未找到原因,请高人指教,在下将不胜感激!
其中主要代码如下:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Diagnostics;


namespace NetCom
{
/// <summary>
/// MsgBase 的摘要说明。
/// </summary>
///

public class NetBase
{
private TcpListener MsgListener;
private Thread thListen;
private Thread thSend;
private IPAddress SendIP;
private int SendPort;
private string SendMsg;
private bool ServiceState;

public delegate void OnMessageReceiveEventHandler (string SourceString); //定义一个委托,用于将消息侦听循环中的消息传出
public event OnMessageReceiveEventHandler OnMessageReceiveHandler; //定义一个收到消息事件,用于传送消息

public NetBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
this.MsgListener=null;
this.ServiceState=false;
}

//初始化连接
public bool InitListen (IPAddress IP,int Port)
{
bool flag=false;

IPAddress LocaleIP;
int LocalePort;

if (IP.ToString()!="") //判断IP是否为空,不为空就设为本地IP
{
LocaleIP=IP;
}
else
{
IPHostEntry IPInfo=Dns.Resolve("127.0.0.1"); //本地主机IP信息
IPAddress [] IPList=IPInfo.AddressList;
LocaleIP=IPList[0];
}

if (Port<1025)
{
flag=true;
}
else
{
try
{
LocalePort=Port;
this.MsgListener=new TcpListener(LocaleIP,LocalePort); //创建本地侦听对像
}
catch (Exception Error)
{
Debug.WriteLine("连接初始化出错:\n"+Error.ToString());
}
finally
{
flag=true;
}
}

return flag;
}


//开始侦听
public bool StartListen ()
{
bool flag=false;

try
{
this.MsgListener.Start(); //开始侦听
this.thListen=new Thread(new ThreadStart(this.Listener)); //新建侦听线程
this.thListen.Name="MS_Listener"; //给侦听线程命名
this.ServiceState=true;
this.thListen.Start(); //开启侦听线程
}

catch (Exception e)
{
Debug.WriteLine("开启侦听出错:\n"+e.ToString());
}

return flag;
}

//侦听器,接收消息进行消息处理
private void Listener ()
{
TcpClient MsgClient;
NetworkStream MsgStream;
StreamReader MsgReader;

try
{
while (this.ServiceState)
{
MsgClient=MsgListener.AcceptTcpClient(); //本地侦听对像建立
MsgStream=MsgClient.GetStream(); //数据流建立
MsgReader=new StreamReader(MsgStream); //设置读写器


string ReceiveString=MsgReader.ReadToEnd(); //从数据流中读取数据
this.OnMessageReceiveHandler(ReceiveString); //用事件返回消息
Debug.WriteLine(ReceiveString);

MsgReader.Close();
MsgStream.Close();
MsgClient.Close();
}
}
catch (Exception e)
{
//由于终止线程后还处于侦听状,所以会报错
Debug.WriteLine("侦听出错:\n"+e.ToString());

string Error=e.ToString();
}
finally
{
}
}


//停止侦听
public bool StopListen ()
{
bool flag=false;

try
{
this.ServiceState=false;
this.thListen.Abort();
this.MsgListener.Stop();
}
catch (Exception e)
{
Debug.WriteLine("关闭连接出错:\n"+e.ToString());
}

return flag;
}


//确家定是否有挂起的连接请求
public bool IsClientConnect ()
{
bool flag=false;

flag=this.MsgListener.Pending();

return flag;
}


//发送消息
public bool MsgSend (IPAddress HostIP,int HostPort,string SendString)
{
bool flag=false;

if (HostIP==null||HostPort<1025)
{
flag=true;
return flag;
}
else
{
this.SendIP=HostIP;
this.SendPort=HostPort;
this.SendMsg=SendString;

this.thSend=new Thread(new ThreadStart(this.Send));
this.thSend.Name="MS_Sender";
this.thSend.Start();
Thread.Sleep(300);
this.thSend.Abort();
}

return flag;
}

private void Send ()
{
TcpClient ClientWriter=new TcpClient(); //建立远程连接对像
ClientWriter.Connect(this.SendIP,this.SendPort); //连接对像设置

try
{
NetworkStream MsgStream=ClientWriter.GetStream(); //建立数据流
StreamWriter MsgWriter=new StreamWriter(MsgStream); //建立读写器

MsgWriter.Write(this.SendMsg); //将数据写入数据流

MsgWriter.Flush(); //刷新数据流
MsgWriter.Close(); //关闭读写器
MsgStream.Close(); //关闭数据流
ClientWriter.Close(); //关闭连接对像
}
catch (Exception WriteStreamError)
{
Debug.WriteLine("发送消息出错:\n"+WriteStreamError);
}
finally
{
}
}


private string MessageReceive (string SourceString) //消息返回函数
{
string ReceiveString=SourceString;

return ReceiveString;
}
}
}
...全文
97 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
miqier 2004-08-16
  • 打赏
  • 举报
回复
发邮件给我,给你个现成的代码
zhiming@ssreader.com
angeryman 2004-08-16
  • 打赏
  • 举报
回复
????
没人回答?

110,538

社区成员

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

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

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