修改客户端 与服务器断开,如何处理服务器或客户端socket断开

《如何处理服务器或客户端socket断开》由会员分享,可在线阅读,更多相关《如何处理服务器或客户端socket断开(10页珍藏版)》请在人人文库网上搜索。

1、编程经验谈 如何处理socket连接后服务器端或Socket编程经验谈-如何处理socket连接后服务器端或客户端的断开(转)2010年12月29日星期三14:50现象:服务器端等待客户断连接,当socket连接建立后,如果客户端异常断开,服务器会抛出异常,从而导致程序运行中断目标:希望服务器一直等待连接,客户端中断后程序不退出,而客户端重新恢复后可以继续保持连接代码:public class Receivepublic static byte buffer=new byte1024;public static ManualResetEvent socketEvent=new ManualRe。

2、setEvent(false);public static Socket sListener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);public static Socket handler=null;public static string ClientBroken=An connection was forcibly closed by the remote host;public static void receive()tryConsole.WriteLine(Main Thre。

3、adID:+AppDomain.GetCurrentThreadId();byte bytes=new byte1024;IPAddress ipAddr=IPAddress.Parse(127.0.0.1);int Port=10001;IPEndPoint EPServer=new IPEndPoint(ipAddr,Port);/Binding asocket sListener.Bind(EPServer);/Start listening sListener.Listen(10);while(true)if(handler=null)/first must make aconnect。

4、 Console.WriteLine(waiting for aconnection.);/asychronous function for accepting connections sListener.BeginAccept(new AsyncCallback(AcceptCallback),sListener);socketEvent.WaitOne();handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);socketEvent.WaitOne();elseCo。

5、nsole.WriteLine(waiting next message.);socketEvent.Reset();handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);socketEvent.WaitOne();Console.ReadLine();catch(Exception e)Console.WriteLine(e.ToString();Console.ReadLine();public static void AcceptCallback(IAsyncRe。

6、sult ar)tryConsole.WriteLine(AcceptCallback Thread ID:+AppDomain.GetCurrentThreadId();Socket listener=(Socket)ar.AsyncState;/new socket handler=listener.EndAccept(ar);handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);catch(Exception e)Console.WriteLine(e.ToStr。

7、ing();public static void ReceiveCallback(IAsyncResult ar)string err_message=null;tryConsole.WriteLine(ReceiveCallback Thread ID:+AppDomain.GetCurrentThreadId();string content=String.Empty;handler=(Socket)ar.AsyncState;int bytesRead=handler.EndReceive(ar);/if there is some data.if(bytesRead 0)/append。

8、 it to the main string content+=Encoding.ASCII.GetString(buffer,0,bytesRead);/if we encounter the end of message character if(content.IndexOf(char)3)-1|content.IndexOf(char)16)-1)Console.WriteLine(Read+content.Length+bytes from socket.n Data:+content);socketEvent.Set();else/otherwise receive the rem。

9、aining data handler.BeginReceive(buffer,0,buffer.Length,0,new AsyncCallback(ReceiveCallback),handler);catch(Exception e)err_message=e.Message;if(err_message.IndexOf(An existing connection was forcibly closed by the remote host)-1)Console.WriteLine(An existing connection was forcibly closed by the re。

10、mote host);/handler.Shutdown(SocketShutdown.Both);/handler.Close();Console.WriteLine(waiting for aconnection.);/asychronous function for accepting connections sListener.BeginAccept(new AsyncCallback(AcceptCallback),sListener);elseConsole.WriteLine(e.ToString();说明:关键在于最后这段的异常处理,接收中断后,服务器端重新等待接收。现象:客户。

11、端与服务器连接,当socket连接建立后,如果服务器端异常断开,客户端会抛出异常,从而导致程序运行中断目标:希望客户端出现提示,服务器端中断后程序不退出,而服务器端重新恢复后可以继续保持连接代码:public class AsyncCommpublic static string theResponse=;public static byte buffer=new byte1024;public static ManualResetEvent socketEvent=new ManualResetEvent(false);public static Socket sClient=new Soc。

12、ket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);public static IPEndPoint EPServer=new IPEndPoint(IPAddress.Parse(127.0.0.1),10001);public static void send(string data)byte byteData=null;byteData=Encoding.ASCII.GetBytes(data);tryif(!sClient.Connected)Console.WriteLine(System.DateTi。

13、me.Now.ToString(yyyy-MM-dd HH:mm:ss:ffff)+Connect begining.);sClient.BeginConnect(EPServer,new AsyncCallback(ConnectCallback),sClient);socketEvent.WaitOne();sClient.BeginSend(byteData,0,byteData.Length,0,new AsyncCallback(SendCallback),sClient);socketEvent.WaitOne();catch(Exception e)Console.WriteLi。

14、ne(Server side is broken.);socketEvent.Reset();return;public static void ConnectCallback(IAsyncResult ar)tryThread thr=Thread.CurrentThread;Console.WriteLine(ConnectCallback Thread State:+AppDomain.GetCurrentThreadId();Socket sClient=(Socket)ar.AsyncState;sClient.EndConnect(ar);Console.WriteLine(Soc。

15、ket connected to+sClient.RemoteEndPoint.ToString();socketEvent.Set();catch(Exception ex)Console.WriteLine(System.DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss:ffff)+|+AppDomain.GetCurrentThreadId()+|3-Level 3Server connection is broken,waiting for Level 3Server connection.);sClient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);socketEvent.Set();receive函数相同,可以参照写出说明:在每次发送或接收时检测当前socket是否连接,如果没有连接,就启动连接,并阻塞线程等待ConnectCallback的返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值