socket的一个错误的解释SocketException以及其他几个常见异常
写socket程序有可能会遇见这个问题
- public void SetSocket()
- {
- Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- socket.Bind(new IPEndPoint(IPAddress.Parse(this.txtIp.Text), int.Parse(this.txtPoint.Text)));
- socket.Listen();
- ThreadPool.QueueUserWorkItem(new WaitCallback(SendInfoOfService), socket);
- }
- //接收连接请求,使用线程调用接受客户短信息的方法
- public void SendInfoOfService(object socket)
- {
- var proxSocket = (Socket)socket;
- while (true)
- {
- var serverSocket = proxSocket.Accept();
- clientSocket.Add(serverSocket);
- ThreadPool.QueueUserWorkItem(new WaitCallback(ReciveInfo), serverSocket);
- }
- }
之前是在线程池里面的队列里传递了一个监听的socket作为参数,到了接收信息的方法里面我没有再重新创建一个接收数据的线程,所以就引发了这个错,现在加入了
- var serverSocket = proxSocket.Accept();这个并且把这个监听线程作为参数传递下去到这个方法里:
- //接受客户短信息
- public void ReciveInfo(object socket)
- {
- var proxSocket = (Socket)socket;
- byte[] data = new byte[ * ];
- while (true)
- {
- int i = proxSocket.Receive(data, , data.Length, SocketFlags.None);
- if (i <= )
- {
- proxSocket.Shutdown(SocketShutdown.Both);
- proxSocket.Close();
- clientSocket.Remove(proxSocket);
- return;
- }
- string str = Encoding.Default.GetString(data, , i);
- this.txtContent.Text = str;
- }
- }
问题解决
- 此外,还有几个地方需要使用try catch去处理,防止异常,
1、防止用户异常退出,在接收数据的信息里面如果发送的字节是0则表示用户退出,为了防止推出异常,加入如下代码,这个异常的处理应该在客户端和服务器端都写上
- int len = 0;
- try
- {
- len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);
- }
- catch (Exception ex)
- {
- //异常退出
- AppendTextToTxtLog(string.Format("服务器端:{0}非正常退出", proxSocket.RemoteEndPoint.ToString()));
- StopContnet();//关闭连接
- return;
- }
- if (len <= 0)
- {
- //客户端正常退出
- AppendTextToTxtLog(string.Format("服务器端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));
- StopContnet();//停止连接
- return;//让方法结束,终结当前接受客户端数据的异步线程。
- }
2、防止关闭Socket的时候出现异常,等1秒之后如果还不关闭出现异常的话,加入如下代码
- //关闭Socket
- public void StopConn()
- {
- if(clientSocket.Connected)
- {
- try
- {
- clientSocket.Shutdown(SocketShutdown.Both);
- clientSocket.Close(100);
- return;
- }
- catch (Exception)
- {
- throw;
- }
- }
- }
3、为了防止客户端连接服务器端失败,可以加入如下方法
- try
- {
- socket.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPoint.Text));
- }
- catch (Exception)
- {
- MessageBox.Show("败了,重新连接");
- //Thread.Sleep(500);
- //btnConnect_Click(this,e);//睡眠0.5S之后重新调用这个控件的方法,相当于重新连接
- return;
- }
socket的一个错误的解释SocketException以及其他几个常见异常的更多相关文章
- java的Socket通信例子及关于java.net.SocketException: Socket is closed错误
今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...
- Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释
另外http://www.cnblogs.com/fengmk2/archive/2007/01/15/using-Socket.html可供参考 一Java socket 说明 所谓socket ...
- linux socket读数据错误解释
EINTR 表示某种阻塞的操作,被接收到的信号中断,造成的一种错误返回值. EAGAIN 从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作( ...
- Okhttp 多次调用同一个方法出现错误java.net.SocketException: Socket closed
Okhttp 多次调用同一个方法出现错误java.net.SocketException: Socket closed https://blog.csdn.net/QQiqq1314/article/ ...
- Delphi 通信报Asynchronous socket error 10053错误的一个解决方法
在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时, ...
- JMeter一个错误the target server failed to respond--JMeter坑
问题:1.在测试一个http景象,特别是集波动TPS时刻,出现了一个错误.它现在是一个必须错误(压力顺利时却零星的错误,甚至很少见): 每次必现错误(開始一直怀疑是网络或程序的问题) 2.失败事务 ...
- Nodejs发送Post请求时出现socket hang up错误的解决办法
参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...
- application Initialization设置导致处理程序ExtensionlessUrlHandler-Integrated-4.0在其模块列表中有一个错误模块问题的解决
HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“Ma ...
- 命令行连接mysql服务器时 报Can't connect to local MySQL server through socket 'xxx.sock'错误
本来之前用的好好的mysql服务器,突然就报Can't connect to local MySQL server through socket 'xxx.sock'错误了 遇到该问题思路首先是:检查 ...
随机推荐
- sass 常用函数的整理
@charset "utf-8"; @import "compass/css3/inline-block"; @import "compass/css ...
- HDU 2084 数塔
没什么好说的,这是我学DP的第一道题目. //#define LOCAL #include <iostream> #include <cstdio> #include < ...
- 51nod1052 最大M子段和
dp优化我总是不太熟练.这一次首先我写了O(n4)->O(n3)->O(n2).一步步的优化过来.yyl好像用的是单调队列优化dp我看不懂他的代码... O(n4) #include< ...
- Jquery源码中的Javascript基础知识(一)
jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...
- (转)ios获取设备系统信息
UIDevice *device_=[[UIDevice alloc] init]; NSLog(@"设备所有者的名称--%@",device_.name); NSLog(@&qu ...
- Java 动态眨眼 EyesJPanel (整理)
/** * Java 动态眨眼 EyesJPanel (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 * 注意事项: * 1.本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档: ...
- Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396 本博客已迁移到本人独立博客: http://www.yun5u ...
- IconRes提供免费高质量的Material风格android官方图标库
连接地址: http://www.iconres.com/android/index.php
- Java常用类:String
一.介绍 String:不可变的Unicode字符序列 例如:"Java" 就是4个Unicode字符J,a,v,a组成的 Java没有内置的字符串类型,而是在标准的J ...
- Yii系列教程(四):使用Memcache保存会话
1环境准备 安装Memcached服务端: yum -y installmemcached.x86_64 安装PHP-Memcache扩展: yum -y installphp-pecl-memcac ...