Java Socket常见异常处理 和 网络编程需要注意的问题

 java网络编程Socket通信中,通常会遇到以下异常情况:

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

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

  第2个异常是java.net.ConnectException: 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进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体到你的程序中,就看你如何对程序进行优化了。

Java Socket常见异常处理

时间: 2024-10-29 10:46:33

Java Socket常见异常处理 和 网络编程需要注意的问题的相关文章

Java基础知识强化之网络编程笔记02:Socket通信原理图解

1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网络通信其实就是Socket间的通信.  • 数据在两个Socket间通过IO传输. 2.  Socket通信原理图解:

python基础--面向对象高级、异常处理、网络编程

一.面向对象高级 1.接口与归一化设计 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部功能. 在python中接口由抽象类和抽象方法去实现,接口是不能被实例化的,只能被别的类继承去实现相应的功能 归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的

Java入门 - 高级教程 - 05.网络编程

原文地址:http://www.work100.net/training/java-networking.html更多教程:光束云 - 免费课程 网络编程 序号 文内章节 视频 1 概述 - 2 Socket编程 - 3 ServerSocket类的方法 - 4 Socket类的方法 - 5 InetAddress类的方法 - 6 Socket客户端实例 - 7 Socket服务端实例 - 请参照如上章节导航进行阅读 1.概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连

Java中基于HTTP协议网络编程

java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来訪问Web服务功能,这篇博客,就跟大家分享一下.Java中的网络编程的知识.主要是学习下该java.net包下的API. URI-->URL URI:表示的是统一的资源标识,它是以某种统一的方式标识资源的简单字符串. 这样的字符串以scheme开头. URL:表示统一的资源定位器的任务,URL是一种URI. URN:一般不能为资源提供持久不变的名称.这是统一的资源命名的任务.URN也是一种URI,但它是全球唯一的.持久不

Python之操作Excel、异常处理、网络编程

知识补充: 1.falsk模块中一些方法总结 import flask from flask import request,jsonify server = flask.Flask(__name__) #把当前文件当作一个服务 server.config['JSON_AS_ASCII'] = False #不以ASCII码传 @server.route('/reg',methods=['post','get']) #接口方法前的修饰 methods有两个值:post和get jsonify({"

Java Socket(2): 异常处理

1 超时 套接字底层是基于TCP的,所以socket的超时和TCP超时是相同的.下面先讨论套接字读写缓冲区,接着讨论连接建立超时.读写超时以及JAVA套接字编程的嵌套异常捕获和一个超时例子程序的抓包示例. 一旦创建了一个套接字实例,操作系统就会为其分配缓冲区以存放接收和要发送的数据. (1)socket 读写缓冲区 JAVA可以设置读写缓冲区的大小-setReceiveBufferSize(int size), setSendBufferSize(int size).向输出流写数据并不意味着数据

接口开发、异常处理、网络编程

一.接口开发,有依赖关系的接口开发 1.场景:用户登录后发表文章 用户登录接口代码示例: import flask,time,json from lib import tools server = flask.Flask(__name__) @server.route('/login',methods=['get']) def login(): username = flask.request.values.get('username') pwd = flask.request.values.g

python学习第31天之异常处理、网络编程part1

一,异常处理 1. 什么是异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常 没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止 异常包含三个部分:(1). traceback异常的追踪信息(2). 异常的类型(3). 异常的信息 2. 为何要异常处理 避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性 3. 如何异常处理 错误分为两大类:(1). 语法上的错误:在程序运行前就应该立即修正(2). 逻辑上的错误 try: 代码1 代

day8 (异常处理和网络编程)

一.异常处理 #1 什么是异常? # 异常是错误发生的信号,一旦程序出错,就会产生一个异常,应用程序未处理该异常, # 异常便会抛出,程序随之终止 #2.常见异常类型 #I:语法错误应该在程序运行前修正 # if 1 >2 # print('xxxxx') #II:逻辑错误 #x #NameError: name 'x' is not defined # l=[] # l[10000] #IndexError # class Foo: # pass # Foo.x #AttributeError