Android java.net.SocketException四大异常解决方案

java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题。希望大家有所帮助。那么我们就来看看有关java.net.SocketException的相关知识。

第1个异常是 java.net.BindException:Address already in use: JVM_Bind。

该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监 听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。

第2个异常是java.net.SocketException: Connection refused: connect。

该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端 口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务 服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

第3个异常是java.net.SocketException: Socket is closed,

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

第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关 闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

第5个异常是java.net.SocketException: Broken pipe。

该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对 方关闭连接后自己也要关闭该连接。

编写网络程序时需要注意的问题

第1个问题是要正确区分长、短连接。所谓的长连接是一经建立就永久保持。短连接就是在以下场景下,准备数据—>建立连接— >发送数据—>关闭连接。很多的程序员写了多年的网络程序,居然不知道什么是长连接,什么是短连接。

第2个问题是对长连接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用 Socket的close方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通信程序必须具备的。检测对方的主动断连很简单,主要一方主 动断连,另一方如果在进行读操作,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的连接(调用Socket的close方法)。

而检测对方的宕机、异常退出及网络不通常用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,如果连续几个周期都没 有收到对方心跳,则可以判断对方或者宕机或者异常推出或者网络不通,此时也需要主动关闭己方连接,如果是客户端可在延迟一定时间后重新发起连接。虽然 Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。

第3个问题是处理效率问题。不管是客户端还是服务器,如果是长连接一个程序至少需要两个线程,一个用于接收数据,一个用于发送心跳,写数据不需要专 门的线程,当然另外还需要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收数据,然后再分发给Worker进行数据的 处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体怎么设计你 的程序,就看你自己的设计水平了。

时间: 2024-11-06 03:32:13

Android java.net.SocketException四大异常解决方案的相关文章

java.net.SocketException四大异常解决方案

java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketException的相关知识. 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口

Android Studio更改工程名异常解决方案 :can't rename root module

在修改Android Studio 中 project的名字时 ,提示 “can’t rename root module”. 这是因为Android Studio只能修改根目录内的所有文件,要修改project根目录名字,只能关闭Android Studio 在操作系统中修改文件夹名字. 具体步骤: 1.关闭Android Studio. 2.直接在操作系统中修改好名字. 3.重新import 新名字([NewName])的工程,这样就可以了,相当简单. 其实重新import后,Android

高并发下载tomcat下的文件时,发生java.net.SocketException: Connection reset解决方案

(1)问题产生:使用500个线程并发下载tomcat工程中的一个文件时,服务器出现java.net.SocketException: Connection reset异常, 客户端出现connect timeout: (2)分析认为是服务器连接超过最大并发数而重置,导致客户端连接超时: 于是配置tomcat的配置文件,修改最大并发连接数: 在/home/econf/apache-tomcat-6.0.20/conf目录下,修改server.xml在<Connector port="8080

JAVA+CKEditor+CKFinder 配置异常解决方案

异常1  使用struts2框架上传不了图片怎么办? 当我们在项目中使用struts2框架默认的核心过滤器类和映射配置,struts2会默认会过滤掉CKEditor中的图片,导致图片上传不了服务器,上传图片会出现闪屏现象 默认web.xml配置如下,它将过滤所以请求. <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filte

idea出现 Unable to open debugger port (127.0.0.1:xxxx): java.net.SocketException &quot;socket closed&quot; 解决方案

第一种:重启电脑,太费劲: 第二种: 1)根据端口号找到进程pid netstat -aon|findstr "1099" 2)杀掉进程pid即可 netstat -aon|findstr "49446" 原文地址:https://www.cnblogs.com/banxian-yi/p/12206911.html

getActionBar().setTitle(); Java.lang.NullPoint异常解决方案

getActionBar().setTitle(); Java.lang.NullPoint异常解决方案,是由于低版本不支持直接获取的缘故,修改方案: try changing your theme to this <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> and not the AppCompat Version 另外一种情况,如果是低版本,API低于

Android:加载Android Design Support Library异常解决方案

Google最新的兼容包Android Design Support Library增加了许多符合Material Design设计规范的控件,如Navigation View,Floating Action Button,SnackBar,Tabs,CoordinatorLayout,AppbarLayout,CollapsingToolbarLayout等. 笔者也及时更新了SDK,获得了Android Design Support Library支持包,但是在导入eclipse工程的过程中

Linux下报 java.net.SocketException权限不够 异常解决

转载自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html 今天在Linux下用Jetty把一个应用启动起来报权限不够异常.其实原因很简单,但是如果一时疏忽可能会习惯性地google一把,我就google了一把,但是发现网上关于这个问题的内容很少.所以我特记录一下,希望能给遇到同样问题的同学有帮助. 异常内容如下: HSFJettyWebAppContext replace servle

Linux上Tomcat访问异常java.net.SocketException: Too many open files

tomcat部署在Linux系统上,访问出现异常:java.net.SocketException: Too many open files 原因:对文件的打开个数超过系统默认上限 利用命令ulimit -a可以看到系统默认open file设置为1024 处理方法: 1.在/etc/pam.d/login文件中添加 session    required     /usr/lib64/security/pam_limits.so 注:64位系统为/usr/lib64/security/pam_