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

JAVA网络编程问题剖析

    博客分类:
  • java
阅读更多

我所说的网络编程就是指Socket编程,首先列举一下用JAVA语言编写Socket程序时的常见异常、原因及解决方法,然后再讲一下编写网络程序需要注意的问题。在分析之前,首先把网络程序中所谓的客户端和服务器弄清楚,它们是在通信层面的,所谓的服务器是接收连接的应用,而所谓的客户是发起连接的应用,与业务层面的客户端和服务器并非一一对应,在实际系统中业务层面的服务器端可能是网络层面客户端。下文所说的服务器和客户端是网络层面的。(本文并不准备对TCP/UDPjava.net包中的API和网络连接建立的过程进行说明)
.网络程序运行过程中的常见异常及处理
1个异常是java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行new ServerSocket(port)port是一个065536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。
2个异常是java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ipport是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。
3个异常是java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socketclose方法)再对网络连接进行读写操作。
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个问题是对长连接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用Socketclose方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通信程序必须具备的。检测对方的主动断连很简单,主要一方主动断连,另一方如果在进行读操作,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的连接(调用Socketclose方法)。而检测对方的宕机、异常退出及网络不通常用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常推出或者网络不通,此时也需要主动关闭己方连接,如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。
3个问题是处理效率问题。不管是客户端还是服务器,如果是长连接一个程序至少需要两个线程,一个用于接收数据,一个用于发送心跳,写数据不需要专门的线程,当然另外还需要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收数据,然后再分发给Worker进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体怎么设计你的程序,就看你自己的设计水平了。

分享到:
评论

相关推荐

    Java网络编程/Java网络编程实例

    7. **网络安全**:Java网络编程也涉及网络安全问题,包括加密(SSL/TLS)、身份验证(证书、数字签名)和授权(访问控制)。Java的JSSE(Java Secure Socket Extension)库提供了这些功能。 8. **多线程处理**:在...

    Java网络编程实践课程设计报告.pdf

    项目开发流程是 Java 编程语言的开发流程,包括需求分析、设计、实现、测试和维护等阶段。项目开发流程可以提高程序的质量、可靠性和性能。 通过这份课程设计报告,学生可以掌握 Java 网络编程的相关知识点,提高...

    java网络编程 PPT

    Java网络编程是Java开发中的重要领域,主要用于实现应用程序之间的通信,包括客户端-服务器架构、分布式系统以及互联网数据传输。这份“java网络编程 PPT”来自清华大学,无疑为学习这一主题提供了权威的参考资料。...

    Java 网络编程实例

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个实例中,我们关注的是基于Java的简单聊天应用,其中包括服务器端和客户端的实现,它们能够相互通信。通过这个实例,我们可以...

    java网络编程实例.rar

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

    JAVA网络编程经典源代码

    通过分析和学习这些源代码,开发者不仅可以掌握Java网络编程的基本技巧,还能了解到如何在实际项目中应用这些知识,提升解决问题的能力。此外,源代码中可能还包括对错误处理、性能优化、网络通信协议解析等方面的...

    java网络编程实例4

    8. **实战演练**:“Java网络编程实例4”很可能包含了一系列的实战项目,通过这些实例,你可以深入理解并应用上述理论知识,解决实际问题,提高编程技能。 这个压缩包中很可能包含了详细的教学材料,包括源代码、...

    java网络编程基础

    Java网络编程是构建分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个"java网络编程基础"的...通过分析和学习这两个文件,初学者可以了解Java网络编程的基本概念,为进一步的网络应用开发打下基础。

    Java网络编程 (第二版

    10. **网络调试与性能优化**:最后,书中还会介绍如何使用Java的网络调试工具,以及如何进行网络程序的性能调优,包括错误排查、网络瓶颈分析和系统资源管理。 《Java网络编程(第二版)》是一本全面的教程,涵盖了...

    java网络编程实验书

    【Java网络编程实验详解】 Java网络编程是Java开发中的重要组成...实验过程中的错误调试和问题解决也将提升他们的编程技巧和问题分析能力。实验书的内容全面且实用,适合初学者逐步提升对Java网络编程的理解和应用。

    《Java网络编程》教材附带源代码.

    《Java网络编程》是一本深入探讨Java平台上的网络应用程序开发的经典教材。这本书涵盖了从基本的TCP/IP通信到高级的多线程并发处理...通过分析和运行这些代码,读者能够加深对Java网络编程的理解,并提升实际开发能力。

    Java网络编程与分布式计算

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

    Java网络编程-第三版(中文版).pdf(Elliotte Rusty Harold)

    - **网络爬虫**:利用Java网络编程技术实现数据抓取和分析。 通过阅读《Java网络编程》第三版,开发者可以全面掌握Java在构建网络应用程序时的各种技术和策略,提升自己的网络编程能力,为开发高质量的网络应用...

    java网络编程需要的插件

    它是网络分析软件和网络安全工具的基础,对于需要深入分析网络流量的Java应用,Winpcap是必不可少的组件。由于jpcap提及为64位,这意味着要确保在64位的Windows系统上安装对应的Winpcap版本以确保兼容性。 3. **...

    java网络编程与分布式计算

    Java网络编程是Java开发中的重要领域,它涵盖了网络通信的基础概念、协议以及如何在Java平台上实现这些功能。分布式计算则是利用多台计算机协同工作来处理大量数据或执行复杂任务的技术,它极大地提升了系统的可扩展...

    java网络编程精讲

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

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

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

    java网络编程聊天程序报告

    总结,本Java网络编程聊天程序报告详细阐述了一个基于Java的聊天程序的设计与实现,涵盖了系统的需求分析、功能设计、特点、架构以及权限管理等方面。这样的系统为用户提供了一个安全、高效的在线交流平台,充分体现...

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

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

    java网络编程实例源代码

    通过分析这些实例源代码,你可以学习到如何在Java中实现网络通信,包括TCP和UDP协议的使用,以及Socket编程的基础知识。同时,这些示例也将帮助你理解和处理网络编程中可能遇到的实际问题,如连接管理、数据编码解码...

Global site tag (gtag.js) - Google Analytics