TCP长连接如何设置一个监控线程

opbsm 2009-12-15 10:22:30
因为业务需要 ,需要使用TCP全双工模式进行通讯 但是有问题想请教大家一下

private Socket s = null;
private Thread SendThread; //发送线程
private Thread RecvThread; //处理接线程
private Thread DeamoThread; //监控线程


// 启动3个线程。

private void RecvAndSend()
{
SendThread= new Thread(new ThreadStart(Send)); 一个发
SendThread.Start();

RecvThread = new Thread(new ThreadStart(Recv)); 一个收
RecvThread.Start();

DeamoThread= new Thread(new ThreadStart(Deamo)); 检测是否连接断开,如果断开就要重连接
DeamoThread.Start();

}

private void send ()
{

}

private void recv()
{
}

private void deamo ()
{

}


}


请问 这个监控的线程因该怎么做呢?例如一旦服务端端开,或是其他原因网络故障断开就要重连,并且发送 和接收线程序
也要重新开始收发。如果要用委托和事件来处理这样的程序因该怎么做,我在GOOGLE也收了一下没有收到什么结果,希望各位给点精华的代码指点下,谢谢。在线等



...全文
490 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
opbsm 2009-12-16
  • 打赏
  • 举报
回复
有没有有代码提示啊
zhulinxiaofeng 2009-12-15
  • 打赏
  • 举报
回复
你连续几次心跳失败后,直接关闭掉连接。
然后再做一次重新启动socket监听不就可以了吗。
mjay0210 2009-12-15
  • 打赏
  • 举报
回复
Tcp协议 是默认可靠连接 只会出现 包延迟 不会出现 掉包。

所以别超这个心
opbsm 2009-12-15
  • 打赏
  • 举报
回复

to: INTTNY

阻止发送线程 怎么做
INTTNY 2009-12-15
  • 打赏
  • 举报
回复

Timer timer = new Timer();
//bool running = true; //是否仍需运行
private void recv()
{
while(running)
{
string s = 接收到的信息;
if(!s.StartWith("c2")) //假定c2是响应代码
{
timer.Enable = false;
}
}
}

private void deamo ()
{
while(running)
{
send("c1");//假定c1是控制代码
timer.Enable = true;//开始计时器,即超时时间。若达到了超时时间则说明连接断开
Thread.Sleep(100000);//一会儿后再重新监听是否已掉线
}
}

private void timer_Tick(..)
{
SendThread.Suspend();
尝试重新连接
if(连接上)
{
SendThread.Resume();
}
}


监听线程和接收线程是不需要断开的,阻止发送线程即可。尝试重新连接就是再向目标机发信息看是否已收到响应信息(假定此时的接收线程正常,若不正常需重新设置接收线程)
opbsm 2009-12-15
  • 打赏
  • 举报
回复

但是当 TCP短开的时候,就收不到信息了,发送线程还在不断的发送数据,我的意思是怎么才能当 TCP端开的时候就 发送和接收线程 停止,当再次建立连接的时候,发送和接收线程序又开始运行,这个过程是否可以靠监控线程来完成
private void recv()
{
while(running)
{
string s = 接收到的信息;

if(!s.StartWith("c2")) //假定c2是响应代码
{
客户端重新连接;
}
}
}

private void deamo ()
{
while(running)
{
send("c1");//假定c1是控制代码
Thread.Sleep(100000);//一会儿后再重新监听是否已掉线
}
}
opbsm 2009-12-15
  • 打赏
  • 举报
回复


to : zhulinxiaofeng

我在deamo ()的做过心跳检测。但是例如:网络故障或是对方服务端主动段开,我要就要重联,程序要24小时一直连接着

private void deamo ()
{
// 每隔15秒发送一次
}
INTTNY 2009-12-15
  • 打赏
  • 举报
回复
思路是这样的。监控线程用来定时向目标机器发送一个控制码,然后监听是否有相应的响应吗发送回来,以下给出伪代码。


//bool running = true; //是否仍需运行
private void recv()
{
while(running)
{
string s = 接收到的信息;
if(!s.StartWith("c2")) //假定c2是响应代码
{
客户端重新连接;
}
}
}

private void deamo ()
{
while(running)
{
send("c1");//假定c1是控制代码
Thread.Sleep(100000);//一会儿后再重新监听是否已掉线
}
}
Deathsign 2009-12-15
  • 打赏
  • 举报
回复
TCP是不能实时得到是否连接的

只有发送心跳包标示在线···
czc123456789 2009-12-15
  • 打赏
  • 举报
回复
断了 再连接一次 不过续传 我就不懂了
czc123456789 2009-12-15
  • 打赏
  • 举报
回复
//初始化接受套接字:寻址方案,以字符流方式和Tcp通信
socketSent = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

//设置服务器IP地址和端口
ipSent = new IPEndPoint(IPAddress.Parse(ip), 8001);


//与服务器进行连接
socketSent.Connect(ipSent);
zhulinxiaofeng 2009-12-15
  • 打赏
  • 举报
回复
心跳检测。
opbsm 2009-12-15
  • 打赏
  • 举报
回复
还是不明白,有没有什么代码可以看一下,用事件怎么做监控。
jieon 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 opbsm 的回复:]
但是当 TCP短开的时候,就收不到信息了,发送线程还在不断的发送数据,我的意思是怎么才能当 TCP端开的时候就 发送和接收线程 停止,当再次建立连接的时候,发送和接收线程序又开始运行,这个过程是否可以靠监控线程来完成
[/Quote]
设个全局变量不就可以?每次发送的时候先做判断。
seamone 2009-12-15
  • 打赏
  • 举报
回复
顶上去,学习
opbsm 2009-12-15
  • 打赏
  • 举报
回复
楼上的兄弟能不能写个伪代码
wenbin 2009-12-15
  • 打赏
  • 举报
回复
这个。。。。

异步接收,发送应该没问题。

然后就是管理连接。是一个单独的线程
在这个线程里面要做的东西有,发送心跳,检测连接状态
若是状态断开,那么负责重新连接。

若是你要保证发送数据的完整性呢,在发送后服务端最好能够返回确认的,
不然连接断了,你不知道哪些数据已经发出去了。。
opbsm 2009-12-15
  • 打赏
  • 举报
回复
to wodegege10
那个因该怎么做
wenbin 2009-12-15
  • 打赏
  • 举报
回复
其实若是用异步处理,
只要做一个连接管理线程就好了。
wenbin 2009-12-15
  • 打赏
  • 举报
回复
不用停止呀,发送线程里面加入一个包队列。
接收线程也是一样了。收到数据以事件形式往外传送。

为什么要停止线程呢?

加载更多回复(1)

110,535

社区成员

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

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

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