`
bruceyu
  • 浏览: 29876 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA网络编程问题剖析(转帖)

阅读更多

所说的网络编程就是指Socket编程,首先列举一下用JAVA语言编写Socket程序时的常见异常、原因及解决方法,然后再讲一下编写网络程序需要注意的问题。在分析之前,首先把网络程序中所谓的客户端和服务器弄清楚,它们是在通信层面的,所谓的服务器是接收连接的应用,而所谓的客户是发起连接的应用,与业务层面的客户端和服务器并非一一对应,在实际系统中业务层面的服务器端可能是网络层面客户端。下文所说的服务器和客户端是网络层面的。(本文并不准备对TCP/UDP、java.net包中的API和网络连接建立的过程进行说明)

 


一.网络程序运行过程中的常见异常及处理


第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网络编程技术课程设计

    目前,基于TCP/IP协议的网络得到了普及和飞速的发展,Windows下的网络程序越来越显得重要。利用TCP/IP协议提供的...本次实验采用java语言设计一个基于C/S模式的TCP网络通讯程序。实现客户端与服务器端之间的数据传输。

    java并发编程从入门到精通

    《Java并发编程从入门到精通》内容包括并发编程概念,线程,线程安全,线程集合类,线程阀,线程池,Fork/Join,线程、线程池在互联网项目开发的应用,线程监控及线程分析,Android中线程应用。 本书适合Java开发...

    java并发编程与实践

    java并发编程与实践是java高并发的分析文档,分析并介绍了高并发的解决方案。

    深入Java Servlet网络编程

    第5章 Java Servlet中的网络编程 5. 1 Java套接字网络编程 5. 1. 1 InetAddress类 5. 1. 2 Socket类 5. 1. 3 给手机发送网上短信息 5. 2 Java网络编程中的高层类 5. 2. 1 URL类 5. 2. 2 URLConnection类 第6...

    基于计算机软件开发的 JAVA 编程语言分析

    基于计算机软件开发的 JAVA 编程语言也随之发展了起来, 成为了一个大型的编程语言,并且也被人们所广泛应用了起来,人们也越来越喜欢使用这门编程语言。它被使用于计算机软件的开发工程 上。我们这篇文章主要论述了...

    《Java并发编程的艺术》

    它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。 《Java并发编程的艺术》内容涵盖...

    java网络编程

    java网络编程,详细介绍了java网络编程,逐步剖析网络编程,并指出网络编程的注意要点

    java编程200例(附:JAVA文档完全解读中文版)

    java编程200例(附:JAVA文档完全解读中文版)。针对java编程核心思想;以实例代码的形式剖析java技术;实用性强;内附JAVA文档中文版;可以边编程边参考文档。一举两得啊。极力推荐。

    基于Java数据库编程及其应用分析.pdf

    基于Java数据库编程及其应用分析.pdf

    计算机软件Java编程特点及其技术分析 (1).pdf

    计算机软件Java编程特点及其技术分析 (1).pdf

    《Java并发编程的艺术》源代码

    第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何解决。 第2章介绍Java并发编程的底层实现原理,介绍在CPU和JVM这个层面是如何帮助Java实现并发编程的。 第3章介绍深入介绍...

    计算机软件开发的Java编程语言及应用分析.pdf

    计算机软件开发的Java编程语言及应用分析.pdf

    Java 第三阶段增强分析需求,代码实现能力【网络编程】---- 代码

    Java 第三阶段增强分析需求,代码实现能力【网络编程】---- 代码 Java 第三阶段增强分析需求,代码实现能力【网络编程】---- 代码 Java 第三阶段增强分析需求,代码实现能力【网络编程】---- 代码 Java 第三阶段增强...

    用JavaURL编程爬取并分析网页敏感词

    (2)对网址中的文本进行提取。 (3)建立敏感词库,用文本文件保存。 (4)将该网址所对应的文本中的敏感词提取并高亮显示。 (5)编写文本文件,可以存入多个网址;程序可爬取这些网址中的文本内容,将敏感词记录...

    网络机器人Java编程指南

    该书从Internet编程的基本原理出发,深入浅出、循序渐进地阐述了网络机器人程序Spider、Bot、Aggregator的实现技术,并分析了每种程序的优点及适用场合。本书提供了大量的有效源代码,并对这些代码进行了详细的分析...

    java2编程详解

    Java已经成为了编程语言的骄子。我们可以看到,越来越多的大学在教授数据...这本<Java编程思想>赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。

    Java并发编程的艺术

    它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。, 《Java并发编程的艺术》内容涵盖...

    计算机软件Java编程特点分析.pdf

    计算机软件Java编程特点分析.pdf

    java数据库编程宝典(完整版)002

    此书是JAVA关于数据库编程的必读良书,不过本人觉得不一定适合初学者 本书集综合性、实用性为一体的学习Java数据库编程的优秀书目。. 本书采用循序渐进的方法,并穿插大量的实用性很强的代码实例对以下方面进行了...

Global site tag (gtag.js) - Google Analytics