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…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口,欢迎收藏:放牛的星星:[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容:1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好,才能考虑其他的问题。众所周知,全世界在同一时刻看手表肯定不会看到同一个时间,因为地球是圆的,面对太阳的角度是不一样的,我们一般说时间几点几点,是指的本地时间,比如国…

Python开发之--前端 HTML基础

一:HTML介绍 HTML:超文本标记语言,标准通用标记语言下的一个应用。包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息&…

给与用户建立dblink的权限_网络安全 之 NTFS安全权限

NTFS安全权限一、NTFS权限概述1、通过设置NTFS权限,实现不同的用户访问不同的权限2、分配了正确的访问权限后,用户才能访问其资源3、设置权限防止资源被篡改、删除二、文件系统概述 文件系统即在外部存储设备上组织文件的方法常用的文件系统:…

TCP 连接中的TIME_WAIT

原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断? 百度后,找到原因,主要…

丁丁打折网卷能用吗_微信群控还能用吗?现在什么群控还能使用吗?

微信群控系统还能用吗?为什么现在微信群控系统越来越被限制了呢?其实,微信群控我想在生活中占据着很大的位置!因为微信这么多的使用,现在微信使用人数都是几十亿了,所以很多人看重微信群控系统的市场&#…

错题整理

1.JAVA语言的下面几种数组复制方法中,哪个效率最高? A for循环逐一复制 B System.arraycopy C System.copyof D 使用clone方法 答案:B A、for循环的话,很灵活,但是代码不够简洁. for循环为什么慢,java中所…

xpath中两个冒号_爬虫学习(5)—XPath

之前我们写了一个简单的爬虫,在提取页面信息时我们使用正则表达式来匹配内容,但是正则表达式的书写比较繁琐,而且一旦错误就可能导致匹配失败。对于网页的节点来说,它可以定义id,class或其他的属性,而且节点…

canny算法的实现(android加载图片,数组写入文件换行)

Canny边缘检测首先要对图像进行高斯去噪,前面讲到了高斯去噪处理,这里从对图像灰度进行微分运算讲起吧。微分运算常用的方法是利用模板算子,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素…

【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?

网桥模式访问外网非常慢,经常卡死,ping时断时续 七搞八搞,反复重启了几次 TMD 就好了,也不知道什么情况,VirtualBox还是不太好使啊。。。。。 网桥模式 设置 如下: 参考资料: http://blog.csdn…

白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试

继上一讲:隅巳毕月:达摩克里斯之——排序与查找技术​zhuanlan.zhihu.com我们今天来讲一下软件周期与两种软件测试方法软件开发应遵循一个软件的生命周期,通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期。软…