android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例

1、基于TCP/IP协议的Socket通信相关的基础知识

(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)

TCP/IP是目前Internet网络中的主要协议,它定义了计算机和外设进行通信所使用的规则;TCP/IP网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。而ISO/OSI网络参考模型则包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层。

(2)网络通讯中数据传输的模式

面向连接(TCP)——比如生活中的打电话

无连接(UDP,User Datagram Protocol)——比如发邮件、短信等

(3)端口号

在网络通讯中应用端口号达到区分服务的类别(该服务也就是服务器端相关程序所提供的功能),从而允许服务器端程序在同一时间内能够进行多个不同的网络会话,因为不同的网络会话都有对应的服务端口号,彼此相互区分。

如:WWW服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23,smtp服务的端口号为25,pop3服务的端口号为110等。

在程序中应用端口号时需要注意端口号的范围,端口号其实是一个16位无符号整数,数值范围是0-65535;低于256的端口号保留给标准的应用程序使用,比如pop3的端口号就是110。

2、Java语言中提供基于TCP/IP协议的Socket通信的技术支持

(1)了解什么是Socket(套接字)

网络中双向通讯程序中的某一端称为一个Socket,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。

(2)Java提供客户端套接字Socket类和服务器端套接字ServerSocket类

在JDK系统API库java.net包中提供有客户端套接字Socket类和服务器端套接字ServerSocket类,软件应用系统的开发人员可以应用在网络通信的客户端程序中构建出Socket类的对象实例,也就是当客户端程序需要与服务器端程序进行通讯时,客户端程序需要在客户机程序中创建一个Socket对象,Socket类有多种不同形式的构造方法。

在JDK API中与Socket通信有关的各个接口和功能类都定义在java.net包中,而在对应的服务器端程序中则需要创建出ServerSocket类的对象实例。

在Java程序中构建Socket类的对象实例需要提供服务器端主机的IP地址以及服务器端相关程序所提供的对外服务的端口号,从而使得不同的客户端程序应用IP地址可以区分不同的服务器主机,同时再通过端口号进一步区分在同一服务器主机中可能提供不同的功能服务。

(3)基于Socket通讯的主要过程

通讯的主要过程包括Socket的建立、监听、连接、发送数据和接收数据等环节。

3、Socket通讯实现中客户/服务器端通讯的主要方式及工作原理

(1)客户/服务器端通讯的主要方式

在网络通讯中的客户端和服务器端之间的通讯方式主要有如下的两种方式:

"一对一",也就是一个服务器对应一个客户机,此种通讯方式由于通讯的效率低下,目前已经不再应用;

"一对多",也就是一个服务器对应多个连接的客户机。为此,在服务器相关的程序中一般都要应用多线程的技术才能使得服务器程序可以同时响应不同的客户端程序的请求——也就是需要采用一个服务器端程序进程但构建出多个不同的线程。

(2)客户/服务器端通讯的工作原理如下示图所示

e64d0af3858ead5920cf5207fc664bfd.png

4、正确地应用Socket类的构造方法创建出Socket类的对象实例

如下示图为JDK API帮助文档中所提供的Socket类的各种构造方法的定义,但在Socket类中两个常用的构造方法分别是 Socket(InetAddress addr, int port) 和 Socket(String host, int port),它们都能够创建出一个基于Socket的连接服务器端流的套接字对象。

55739461f4a12f8fcda6d9347ef6b81e.png

在程序中可以通过构造方法Socket(InetAddress addr, int port)内的第1个参数InetAddress类对象实例addr获得服务器端主机的IP地址,而在程序中通过构造方法Socket(String host, int port)中的第1个字符串类型参数host可以获得代表服务器端主机的名称字符串。

这两个构造方法都声明有抛出UnknownHostException异常类对象。下面为构造Socket类对象实例的代码片段示例:

try {Socket oneSocketObject =new Socket("服务器IP地址","端口号");}catch(UnknownHostException e){}catch (Ioexception e){}

5、如何获得服务器端主机及客户端主机的IP地址

由于Socket类对象实例可以出现在网络通讯中的客户端程序和服务器端程序中,因此在客户端和服务器端不同的程序中通过调用Socket类对象实例中的同一个方法但获得的结果却是不同的,读者在程序中应用时需要加以区分。

(1)在客户端程序代码中通过调用Socket类对象实例中的getInetAddress()方法可以获得远程服务器端主机的IP地址,而通过调用Socket类对象实例中的getPort()可以获得远程服务器端主机的端口号。

(2)在服务器端程序代码中通过调用Socket类对象实例中的getInetAddress()方法可以获得远程客户端主机的IP地址。

(3)在服务器端程序代码中通过调用Socket类中的getLocalAddress()可以获得服务器端本机的IP地址,而通过调用Socket类中的getLocalPort()可以获得服务器端本机的端口号。

(4)在客户端程序代码中通过调用Socket类中的getLocalAddress()可以获得客户端本机的IP地址,而通过调用Socket类中的getLocalPort()可以获得客户端本机的端口号(此端口号其实就是连接到服务器的端口号)。

6、获得服务器的主机名和对应的IP地址的程序代码示例

(1)依据服务器的主机名获得服务器的IP地址

InetAddress类存储远程系统的IP地址,如下代码片段示例是根据所提供的服务器端主机名称字符串"WWW-XUMIF9WPKIP "(可以为其它主机名称字符串或者包括本机"localhost"字符串等)获得对应的IP地址。

try{      InetAddress serverInetAddress = InetAddress.getByName("WWW-XUMIF9WPKIP ");      System.out.println("服务器主机IP地址为:"+ serverInetAddress.toString());}catch (UnknownHostException e){}

对其中的serverInetAddress.toString()的调用代码也可以改用如下的语句System.out.println("服务器主机IP地址为:"+ serverInetAddress.getHostAddress());显示出服务器主机IP地址。程序代码执行的结果参见如下示图所示。

ef5372e31c406fef71c2001e07b7df20.png

(2)依据服务器主机的IP地址获得服务器的主机名

在InetAddress类中提供有static 静态类型的public static InetAddress getByAddress(byte[] addr) throws UnknownHostException方法,该方法根据给定服务器主机IP 地址(由4字节的数组参数表示)返回 InetAddress 类型的对象实例。

如下代码示例是假定服务器主机的IP地址为192.168.0.1,然后再依据该IP地址获得对应的主机名称字符串的代码片段示例。

try{      byte[] serverHostIPByteArray = new byte[] { (byte) 192, (byte) 168, 0, 1 };      InetAddress serverInetAddress = InetAddress.getByAddress(serverHostIPByteArray);      System.out.println("服务器主机名称为:"+  serverInetAddress.getHostName ());}catch (UnknownHostException e){}

7、如何正确地关闭Socket类的对象实例以及时释放所占的系统资源

当构造出Socket类的对象实例时,Java虚拟机JVM系统同样也需要为它分配一定的系统资源。因此,在软件应用系统程序中如果不再需要Socket类的对象实例时,应该及时地将它关闭掉以释放所占用的系统资源。

关闭Socket类的对象实例分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指由本地客户端主机主动发起的关闭行为;而后者则是指本地主机检测到远程服务器主机发起的关闭行为之后,相应地也作出对应关闭的回应,从而关闭整个通讯中的连接。

下面为关闭Socket类对象实例的代码片段示例,并且要将这些程序代码放在finally 关键字所标识的语句块中以保证在程序中即使出现异常也能够正常地被执行:

finally {      try{            /** 下面代码中的oneSocketInputObject对象代表Socket输入流对象实例 */            oneSocketInputObject.close();            /** 下面代码中的oneSocketOutputObject对象代表Socket输出流对象实例 */            oneSocketOutputObject.close();            /** 下面代码中的oneSocketObject对象代表Socket流对象实例 */            oneSocketObject.close();      }      catch(IOException e){      }}

由于在通讯过程中需要发送和接收数据,因此在客户端还需要构造出Socket输入流对象实例(如示例代码中的oneSocketInputObject)和Socket输出流对象实例(如示例代码中的oneSocketOutputObject),在关闭Socket类对象实例之前首先应该分别关闭与Socket相关的所有输入/输出流对象实例,以释放所有的资源。

而且还要注意关闭代码的顺序——与Socket相关的所有输入/输出IO流对象实例应该要先关闭,然后再关闭Socket类对象实例本身。

尽管Java语言中提供有垃圾自动回收的机制,Socket通讯过程中所占用的各种网络资源最终是会被Java虚拟机JVM系统释放的。但是为了能够有效地利用系统的资源,建议读者还是按照合理的顺序在程序代码中主动释放这些资源,以避免出现内存泄漏现象。

在程序中如何正确地创建和销毁软件应用系统中文件IO流对象实例

如何应用Java反射技术灵活地创建程序类的对象实例

如何应用GOF设计模式中的构建者模式创建复合对象实例

如何合理地创建对象实例以降低程序类之间关系的耦合度

如何正确应用对象/关系映射技术实现系统持久层中各个DAO组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合,可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程,以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

css3 transform matrix 深入理解

矩阵可以用来表示图形的变换。css3定义了matrix和matrix3d方法,用来表示2维和3维的变换。下文将分析这两个接口的使用方法,并且用下文的思路,实现了一个简单的用js控制css3变换的jquery插件css3js , 变换矩阵和净变换矩阵 matri…

php给留言分配id_简单实现PHP留言板功能

本文实例为大家分享了PHP留言板功能的具体实现代码,供大家参考,具体内容如下HTML代码PHP留言本留言者: {$vo.nickname}|邮箱: {$vo.email}时间: {$vo.replytime}内容: {$vo.content}{$vo.id}楼留言重置function clearDefaultText(){var nickname docume…

所有选择器

*            $("*")          所有元素 #id            $("#lastname")       id"lastname" 的元素 .class           $(".intro")…

随机数公式生成一个负数和正数之间的数_java产生从负数到正数范围的随机数方法...

第四步 完整代码至于调用方法嘛:写个test测试下;(这个方法不好代码看起来很乱,你也可以实例化,然后另写一个test调用)复制代码注意包名需要改成代码所在的包名,我的包名是求平均数package 求平均数;import java.util.A…

sklearn、theano、TensorFlow 以及 theras 的理解

sklearn ⇒ 机器学习算法和模型;theras theanoTensorFlow1. 理解模型以及函数,参数返回值的实际意义 一定要注意模型的构造函数,接收的参数列表,以及该模型本身所要解决的问题,因为在一些实现较好的框架或者库中&#…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论,相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析,是通过电路来描述电池的开路电压、内阻等,以实现对电池外特性的表征。本篇将继续讨论此问题,用Matlab和Amesim模…

loadrunner学习记录一

一、什么是性能测试? 使用自动化测试工具对产品按一定的性能指标进行测试,解决性能瓶颈,给用户最好的体验。 二、性能测试的目的? 目的是验证软件系统是否能够达到用户提出的性能指标,同时发现软件系统中存在的性能瓶颈…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中(链接:(一)视觉系统的全貌),我们已经了解了视觉信息被大脑处理的全过程。现在,我们把目光投向一切的起点——眼睛。实际上,人们提起“视觉”,首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像(即不含噪声的图像)存在的情况下。使用待计算SNR图像(记为A)与原始图像(记为B)做相减运算&…

数据库DBA(3年以内需求)

1、DBA工作:日常维护,备份及恢复,系统安装,补丁应用,健康检查及优化,故障处理; 2、精通sql语句、视图存储过程、函数的编写、触发器; 3、精通data guard/RAC,能顺利配置和管理data guard; 4、精通mysql Mas…

ext get id js_【翻译】Ext JS最新技巧——2015-8-11

Seth Lemmons:使用棒极了的Awesome FontExt JS 6附带了一个新的海卫一主题,可以使用Font Awesome字体作为背景图像的图标。不过,你知道如何通过“iconCls”和“glyph”来使用哪些相同的图标(以及更多来自于广泛的Font Awesome库)吗?使用海卫…

【转载】linux进程及进程控制

Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例。利用分时技术,在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间片内运…

区分大小屏幕_VESA持续推动DisplayHDR认证计划,你的屏幕属于何种等级吗?

美国视频电子标准协会(VESA)今年可说是动作频频,年初先发布了专为OLED与其他自发光显示器所制订的DisplayHDR True Black高动态范围标准,下半年则更新DisplayHDR兼容测试规范至1.1版,并发布新的DisplayHDR 1400性能分级,至于年中所…

WdatePicker显示乱码

1.修改zh-cn.js内容: var $lang{ errAlertMsg: "不合法的日期格式或者日期超出限定范围,需要撤销吗?", aWeekStr: ["周","日","一","二","三","四","五","六"],…

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器呈现内容,中间发生了什么。今天的文章主要专注于应用层,我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址,各种网络…

MySQL中order by中关于NULL值的排序问题

MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么…

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展,手机像素越来越高,里面的功能也越来越丰富,手机拍照成了不少人的日常,如果你很爱拍照,手机里有一大堆照片,那么教你用手机自带的相册功能,一键将照片制作成电影,…

bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班

思路:可以贪心,也可以最短路。 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可&#xff…