`
bruceyu
  • 浏览: 31120 次
  • 性别: 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网络编程实例.rar

    Java网络编程是Java开发中的重要领域,它涵盖了各种在分布式系统中进行通信的技术。这个"java网络编程实例.rar"的压缩包显然包含了帮助开发者理解和实践Java网络编程的资源。让我们详细探讨一下Java网络编程的核心...

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

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

    java网络编程精讲

    通过对Java网络编程的学习,我们不仅掌握了网络编程的基本概念和技术细节,还了解了如何运用这些技术来解决实际问题。从简单的Socket通信到复杂的多线程和非阻塞I/O处理,Java为我们提供了丰富的工具和支持。此外,...

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

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

    java网络编程--qq聊天程序源代码

    分析和学习这些源代码可以帮助我们理解如何在实际项目中应用Java网络编程技术。 此外,开发此类应用程序还需要考虑到安全性、并发处理、错误处理和性能优化等方面。例如,使用线程池来处理多个并发连接,加密敏感...

    《java 并发编程实战高清PDF版》

    Java内存模型(JMM)是理解并发编程中数据一致性问题的基础。JMM定义了线程如何访问和共享内存,确保在并发环境下正确地执行。书中详细阐述了可见性、原子性和有序性这些概念,并通过`volatile`关键字和`final`修饰...

    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网络编程的核心概念和技术,有...

    网络编程小测试

    在IT行业中,网络编程是构建分布式系统和互联网应用程序的基础...通过分析和实现Server.java和Client.java,开发者可以深入了解Java网络编程的原理和实践,这对于开发网络应用、服务端软件或者分布式系统是至关重要的。

    Java2编程详解(Special_Edition_Using_Java)

    《Java2编程详解》这本书是Java编程领域的一部经典之作,特别版的使用指南深入剖析了Java 2平台的核心技术和编程方法。这本书旨在帮助开发者掌握Java语言的基础以及高级特性,从而能够有效地进行软件开发。 首先,...

    java web 网络编程技术

    根据给定的文件信息,我们将深入探讨“Java Web网络编程技术”这一主题,并结合描述中的其他元素如C#编译与连接以及网页制作等进行详细分析。 ### Java Web网络编程技术 #### 一、Java Web简介 Java Web是指用Java...

    java并发编程与实践

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

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

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

    JAVA网络编程

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

    java网络编程

    本篇将深入探讨这些核心知识点,并结合课堂练习与PPT讲解,帮助你全面理解和掌握Java网络编程。 首先,我们来了解Java网络编程的基础——TCP/IP协议。TCP(传输控制协议)和IP(互联网协议)是互联网通信的基石。...

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

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

    Java网络高级编程.pdf

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

    \"java 网络编程\"简单总结

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个主题中,我们将深入探讨Java网络编程的基础、原理以及实践应用。以下是对这个话题的详细概述: 一、Java网络编程基础 Java...

Global site tag (gtag.js) - Google Analytics