Socket使用中常见的异常整理

在平时开发过程中,不可避免的会涉及到网络编程,虽然网上有很多网络开发框架,但是基本的网络操作还是要有所了解的,如果想要告别“屌丝码农”的境地,那么基本的网络编程知识是必须的,而且要深入。越深越好~最近看郭霖大哥的一部视频,感觉棒棒的,是讲Android即时推送的,以Androidpn这个开源项目为基础,讲解内部实现原理,相信对理解客户端与服务器通信会有更深入的理解,虽然我刚开始,一个Socket就把我弄懵逼了,现在整理一下在使用Socket过程中常见的异常,自己在使用中遇到了部分,剩下的其他估计在以后会遇到吧,先整理下来,为以后做个铺垫。
1.java.net.SocketTimeoutException.这个异常比较常见,socket超时。一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(SocketAddress endpoint,int timeout)中的后者来决定,还有就是setSoTimeout(int timeout),这个是设定读取的超时时间。它们设置成0均表示无限大。

2.java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port) 或者socket.bind(SocketAddress bindpoint)操作时。
原因:与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

3.java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)或者socket.connect(address,timeout)操作时.
原因:指定ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。应该首先检查客户端的ip和port是否写错了,假如正确则从客户端ping一下服务器看是否能ping通,假如能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。

4.java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是假如一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端假如在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
对于服务器,一般的原因可以认为:
a) 服务器的并发连接数超过了其承载量,服务器会将其中一些连接主动Down掉.
b) 在数据传输的过程中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。

6.java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。
对于4和5这两种情况的异常,需要特别注意连接的维护。在短连接情况下还好,如果是长连接情况,对于连接状态的维护不当,则非常容易出现异常。基本上对长连接需要做的就是:
a) 检测对方的主动断连(对方调用了Socket的close方法)。因为对方主动断连,另一方如果在进行读操作,则此时的返回值是-1。所以一旦检测到对方断连,则主动关闭己方的连接(调用Socket的close方法)。
b) 检测对方的宕机、异常退出及网络不通,一般做法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常退出或者网络不通,此时也需要主动关闭己方连接;如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。

7.java.net.SocketException: Too many open files
原因: 操作系统的中打开文件的最大句柄数受限所致,常常发生在很多个并发用户访问服务器的时候。因为为了执行每个用户的应用服务器都要加载很多文件(new一个socket就需要一个文件句柄),这就会导致打开文件的句柄的缺乏。
解决方式:
a) 尽量把类打成jar包,因为一个jar包只消耗一个文件句柄,如果不打包,一个类就消耗一个文件句柄。
b) java的GC不能关闭网络连接打开的文件句柄,如果没有执行close()则文件句柄将一直存在,而不能被关闭。也可以考虑设置socket的最大打开数来控制这个问题。对操作系统做相关的设置,增加最大文件句柄数量。ulimit -a可以查看系统目前资源限制,ulimit -n 10240则可以修改,这个修改只对当前窗口有效。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python是一种高级编程语言,被广泛用于各种领域的软件开发、数据分析、人工智能和科学计算等。它有许多不同的知识点,下面是一些常见的Python知识点整理: 1. 基本语法:包括变量、数据类型、运算符、条件语句、循环语句等。 2. 函数:定义函数、参数传递、返回值、作用域等。 3. 模块与包:导入模块、使用第三方库、创建和使用自定义包等。 4. 文件操作:读取和写入文件、文件路径操作、异常处理等。 5. 数据结构:列表、元组、字典、集合等。 6. 面向对象编程:类、对象、继承、多态等。 7. 异常处理:捕获和处理异常使用try-except语句等。 8. 正则表达式:匹配模式、替换字符串等。 9. 迭代器与生成器:迭代对象、生成器函数、yield关键字等。 10. 装饰器:函数装饰器、类装饰器等。 11. 并发编程:多线程、多进程、协程等。 12. 文件操作:读写文件、文件路径操作、文件压缩和解压缩等。 13. 数据库操作:连接数据库、执行SQL语句、操作数据库表等。 14. 网络编程:创建TCP/UDP服务器和客户端、Socket编程等。 15. Web开发:使用框架如Django和Flask进行Web应用开发、处理HTTP请求和响应等。 16. 数据分析与可视化:使用NumPy、Pandas和Matplotlib进行数据处理和可视化。 17. 机器学习:使用Scikit-learn库进行机器学习模型的建立和训练。 18. 数据爬取:使用BeautifulSoup和Scrapy进行网页爬取和数据提取。 19. 测试与调试:编写单元测试、调试程序等。 20. 性能优化:代码优化、内存管理、并行计算等。 这只是Python知识点的一小部分,Python是一门非常丰富的语言,还有很多其他的知识点值得深入学习和探索。 相关问题: 1. Python为什么在数据分析和科学计算领域广泛使用? 2. Python的模块和包有什么区别?如何导入和使用它们? 3. Python异常处理是怎样工作的?为什么它在编程很重要? 4. Python的迭代器和生成器有什么区别?如何使用它们来提高代码效率? 5. Python的装饰器是什么?如何使用它们来增强函数或类的功能? 6. Python的多线程和多进程有什么区别?如何在程序使用它们? 7. 在Python如何进行文件的读写操作?如何处理文件路径和异常? 8. 如何使用Python进行数据库操作?如何连接数据库和执行SQL语句? 9. Python如何进行网络编程?如何创建和使用TCP/UDP服务器和客户端? 10. 如何使用Python进行Web开发?如何使用框架来创建Web应用? 11. Python如何进行数据爬取和数据处理?如何使用相关的库? 12. Python如何进行测试和调试?如何编写单元测试和调试程序? 13. 如何使用Python进行性能优化?如何优化代码和内存管理? 14. Python在人工智能领域有哪些常用的库和框架?如何使用它们来构建机器学习模型?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值