`
bruceyu
  • 浏览: 31387 次
  • 性别: 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网络编程与分布式计算

    Java网络编程与分布式计算是计算机科学中的重要领域,尤其在当今云计算和大数据时代,其重要性日益凸显。本文将深入探讨这两个主题,并结合文件名称"Java网络编程与分布式计算"来解析相关知识点。 首先,Java网络...

    java网络编程第4版源码java network programming 4th edition source code

    通过阅读和分析这些源码,你可以深入理解Java网络编程的细节,提升你的编程技能,并能够解决实际项目中的网络问题。此外,源码中的注释和设计模式也会对你的编程思维和代码组织能力产生积极影响。

    Java 网络编程实验报告 含实验总结

    Java网络编程是计算机科学中的一个重要领域,特别是在分布式系统和服务器端开发中不可或缺。这个实验报告主要涉及了两个关键概念:I/O操作和线程管理,同时包含了一个基本的聊天室代码实现,这为我们提供了理解Java...

    java网络编程实例原文件代码

    Java网络编程是软件开发中的重要领域,特别是...通过学习和分析这两个文件,你可以深入理解Java网络编程的基本原理和实践技巧,提升你的编程能力。在实际项目中,这些基础知识将有助于你构建更复杂、更高效的网络应用。

    Java 并发编程实战.pdf

    《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...

    java网络编程学习资料

    Java网络编程是Java开发中的...总之,Java网络编程不仅需要理解网络原理,还要熟悉Java的相关API和框架,同时注重实战和问题解决能力的培养。这份学习资料将帮助你逐步掌握这些技能,成为一名出色的Java网络程序员。

    java网络编程Demo

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个"Java网络编程Demo"中,我们将探讨TCP(传输控制协议)和UDP(用户数据报协议)这两种主要的网络通信协议在Java中的应用。 ...

    java网络通信编程基础知识介绍

    Java网络通信编程是Java开发中的重要领域,它涵盖了在分布式系统中如何使不同的计算机节点之间进行数据交换。本文将深入探讨Java网络编程的基础知识,包括TCP/IP协议、套接字(Socket)、ServerSocket以及相关API的...

    java网络编程聊天室

    通过阅读和分析这些代码,学生可以更好地理解Java网络编程的实际应用,并从中学习到如何组织和设计网络通信的架构。 总之,"java网络编程聊天室"项目是一个很好的学习实践,涵盖了Java网络编程的核心概念和技术,有...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

    Java游戏编程原理与实践教程源码

    Java游戏编程原理与实践是计算机科学中的一个重要领域,它结合了Java编程语言的特性与游戏设计的技巧。在这个教程源码包中,包含了多种经典游戏的实现,如推箱子、俄罗斯方块、超级玛丽等,这些都是游戏开发初学者和...

    Java并发编程从入门到精通(pdf)(附源码)

    源码分析部分,书中的附带源码可以帮助读者更直观地理解并发编程的实践应用,通过阅读和调试代码,可以深化对理论知识的理解,提升解决实际问题的能力。 最后,书中可能还会涉及一些高级话题,比如线程池的配置与...

    JAVA网络编程

    通过阅读和分析压缩包中的“Java网络编程与分布式计算.[it270.com]”资源,你可以深入理解如何在实际项目中运用这些技术,实现高性能、安全的网络应用。这份资料可能包含了网络编程的基本原理、示例代码以及分布式...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    10. **死锁、活锁与饥饿**:这些是并发编程中的常见问题,书中会分析它们产生的原因并给出避免策略。 通过学习《Java 并发编程实战》,开发者可以更好地理解和掌握Java并发编程的核心技术,从而编写出更健壮、高效...

    华科-计算机网络实验报告-Java Socket编程-网络组建实验.docx

    Java Socket 编程在计算机网络实验中的应用 Java Socket 编程是计算机网络实验中的一个重要组成部分,它允许开发者创建可以在网络上传输数据的应用程序。下面是关于 Java Socket 编程在计算机网络实验中的应用的...

    Java网络高级编程.pdf

    10. **网络调试与性能优化**:了解如何使用网络工具如Wireshark、tcpdump进行网络抓包分析,以及如何利用JDK内置的Netstat工具,对网络性能进行调优,是成为高级Java网络程序员的必备技能。 总之,《Java网络高级...

    java:并发编程的两本书《Java并发编程实战》 《Java并发编程的艺术》 PDF

    《Java并发编程的艺术》是一本全面探讨Java并发编程技术的专业书籍,它深入剖析了Java并发机制的底层实现,如volatile、synchronized等关键技术的工作原理,并详细讲解了线程池、并发容器等高级并发工具的使用。...

    20254Java程序设计之网络编程(第2版

    Java程序设计之网络编程是Java开发中的重要领域,尤其对于初学者来说,理解并掌握这一部分的知识至关重要。网络编程使得Java应用程序能够通过网络进行通信,实现数据交换和远程服务调用。以下是对这个主题的详细讲解...

    java高级编程.zip

    Java高级编程是一个涵盖广泛的主题,包括但不限于多线程、网络编程、I/O流、集合框架、反射、注解、设计模式、JVM优化等多个方面。这份"java高级编程.zip"的压缩包文件很可能是为了帮助Java开发者深入理解这些概念而...

Global site tag (gtag.js) - Google Analytics