`
javasogo
  • 浏览: 1775774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java Socket 网络编程问题剖析

 
阅读更多

我所说的网络编程就是指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 CP/IP Socket编程

    JAVA SOCKET 编程的经典之书,(中文版)里面的代码可直接复制使用! 目录: 第1章简介..........3 1.1 计算机网络,分组报文和协议..........3 1.2 关于地址..........6 1.3 关于名字..........8 1.4 客户端...

    Java_TCPIP_Socket编程

    资源:Java_TCPIP_Socket编程 作者:未知 版本:1.0 主要内容: 第1章简介....................................................................................................................................

    《Java编程技巧典型案例解析》随书光盘

    实例2 Java UDP编程及应用 实例7 Java servlet中对模板文件的处理 实例10 在Java应用程序中播放Midi音乐 实例13 基于Java语言的多线程同步机制 实例14 Java程序中的多线程实现 实例15 利用Java的多线程...

    精通并发与 netty 视频教程(2018)视频教程

    39_NIO中Scattering与Gathering深度解析 40_Selector源码深入分析 41_NIO网络访问模式分析 42_NIO网络编程实例剖析 43_NIO网络编程深度解析 44_NIO网络客户端编写详解 45_深入探索Java字符集编解码 46_字符集编解码...

    leetcode回朔与贪心的题目-interview:面试官的编程

    面向面试官编程>>系列 1. Java 基础 1.1 集合框架 1.2 I/O 1.3 Socket 网络通信 1.4 注解 1.5 反射 1.6 线程基础 1.7 Java 8+( >= 11) 新特性 1,8 常见面试题剖析 2. JVM 2.0 自己编译 JDK 2.1 内存区域与OOM 2.1.1 ...

    精通并发与netty视频教程(2018)视频教程

    7_Netty的Socket编程详解 8_Netty多客户端连接与通信 9_Netty读写检测机制与长连接要素 10_Netty对WebSocket的支援 11_Netty实现服务器端与客户端的长连接通信 12_Google Protobuf详解 13_定义Protobuf文件及消息...

    sources:解读原始码的环境,内部有tomcat原始码,Socket,NIO,Netty等原始码分析材料

    Tomcat原始解析Java网络编程Netty原始解析Spring系列原始解析

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    精通并发与netty 无加密视频

    第7讲:Netty的Socket编程详解 第8讲:Netty多客户端连接与通信 第9讲:Netty读写检测机制与长连接要素 第10讲:Netty对WebSocket的支援 第11讲:Netty实现服务器端与客户端的长连接通信 第12讲:Google ...

    93个netty高并发教学视频下载.txt

    07_Netty的Socket编程详解;08_Netty多客户端连接与通信,09_Netty读写检测机制与长连接要素,10_Netty对WebSocket的支援;11_Netty实现服务器端与客户端的长连接通信;12_Google Protobuf详解;13_定义Protobuf文件...

    leetcode题库-MyNote:`13的学习笔记

    基于socket的网络文件传输 (C/S结构) C++ 参考书籍 《A Tour of C++》 《STL源码剖析》 优秀源码赏析 STL源码赏析 个人项目 控制台实现的小游戏 西洋棋 坦克大战 Java 学习笔记 Java 特性学习笔记 Python 参考书籍 ...

    vc代码合集

    2012-06-11 10:37 151,588 多线程Java Socket编程示例.html 2012-06-11 09:46 56,832 存储管理动态分区分配算法的模拟.doc 2012-06-11 09:45 32,389 完整的串口通信程序VC++源码.7z 2012-06-11 10:41 2,183,866 对...

Global site tag (gtag.js) - Google Analytics