`
bruceyu
  • 浏览: 31709 次
  • 性别: 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平台上的网络应用程序开发的经典教材。这本书涵盖了从基本的TCP/IP通信到高级的多线程并发处理...通过分析和运行这些代码,读者能够加深对Java网络编程的理解,并提升实际开发能力。

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

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

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

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

    java网络编程学习资料

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

    Java 并发编程实战.pdf

    根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...

    java优化编程 java优化编程 java优化编程

    这包括避免冗余计算,减少不必要的对象创建,使用适当的数据结构和算法,以及遵循Java编程的最佳实践,如有效使用StringBuilder而非String进行字符串拼接,避免使用null检查可能导致NPE的代码。 2. **内存管理**:...

    java网络编程Demo

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

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

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

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

    Java编程是目前世界上最流行的编程语言...Java编程不仅能够提高软件开发效率,还能够提升软件的运行效果、稳定性和安全性,帮助开发者满足用户的新要求,解决计算机网络中的各种问题,确保软件的可靠性和用户的安全性。

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    其次,书中深入剖析了Java内存模型(JMM)和可见性问题,这是理解并发编程中数据一致性问题的基础。Java的volatile关键字、synchronized块和方法、以及Atomic类都是解决这些问题的关键工具。作者通过实际案例解释了...

    java并发编程与实践

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

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

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

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

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

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

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

    Java网络高级编程.pdf

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

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

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

    java高级编程.zip

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

    Java网络编程TCP/IP 实例源码

    Java网络编程是构建分布式系统和互联网应用的基础,TCP/IP协议栈则是网络通信的核心。本实例源码集专注于Java实现的TCP/IP网络编程,适合初学者和有经验的开发者加深理解。下面将详细介绍其中涉及的关键知识点。 一...

    Java网络编程案例--CS模型的简单实现

    Java网络编程是构建分布式系统的关键技术之一,而CS模型(Client-Server模型)是网络通信中最常见的架构模式。在这个案例中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的CS模型。 首先,理解CS模型的...

Global site tag (gtag.js) - Google Analytics