第21章网络通信

Internet 提供了大量有用的信息,很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议。

21.1网络程序设计基础

网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的元素封装或不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络知识,也可以编写出高质量的网络通信程序。


1.1局域网与互联网


为了实现两台计算机的通信,必须用一个网络线路连接两台计算机。

1.2网络协议

网络协议规定了计算机之间连接的物理、机械(网线与网卡的连接规定)、电气(有效的电平范围)等特征,计算机之间的相互寻址规则,数据发送冲突的解决方式,长数据如何分段传送与接收等内容。就像不同的国家有不同的法律一样,目前网络协议也有多种。下面简单地介绍几个常用的网络协议。
(1)IP 协议
IP 是Internet Protocol的简称,是一种网络协议。Internet网络采用的协议是TCP/IP协议,其全称是Transmission Control Protocol/Internet Protocol。Internet依靠TCP/IP协议,在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统间的互联。在Internet网络上存在着数以亿计的主机,每台主机都用网络为其分配的Internet地址代表自己,这个地址就是IP地址。

(2)TCP与UDP 协议
在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即传输控制协议(Transmission Control Protocol,TCP)与用户数据报协议(User Datagram Protocol,UDP)。
TCP协议是一种以固接连线为基础的协议,它提供两台计算机间可靠的数据传送。TCP可以保证数据从一端送至连接的另一端时,能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同。因此,TCP协议适合可靠性要求比较高的场合。就像拨打电话,必须先拨号给对方,等两端确定连接后,相互才能听到对方说话,也知道对方回应的是什么。
HTTP、FTP 和 Telnet等都需要使用可靠的通信频道。例如,HTTP从某个URL读取数据时,如果收到的数据顺序与发送时不相同,可能就会出现一个混乱的HTML文件或是一些无效的信息。
UDP是无连接通信协议,不保证数据的可靠传输,但能够向若干个目标发送数据,或接收来自若干个源的数据。UDP以独立发送数据包的方式进行。这种方式就像邮递员送信给收信人,可以寄出很多信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出信件的顺序相同。
UDP协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。这是由于TCP协议在认证上存在额外耗费,可能使传输速度减慢,而UDP协议即使有一小部分数据包遗失或传送顺序有所不同,也不会严重危害该项通信。
注意
一些防火墙和路由器会设置成不允许UDP数据包传输,因此若遇到UDP连接方面的问题,应先确定所在网络是否允许UDP协议。

1.3 端口与套接字


一般而言,一台计算机只有单一的连到网络的物理连接(PhysicalConnection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535的整数。HTTP服务一般使用80端口, FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上,如图21.3所示。
通常,0~1023 的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。
网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可连接电器与电线,如图21.4所示。Java将套接字抽象化为类,程序设计者只需创建Socket类对象,即可使用套接字。

21.2 TCP程序


TCP 网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。

2.1 InetAddress类

jae包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。

import java.net.InetAddress;

import java.rmi.UnknownHostException;

public class Address {

public static void main(String[] args) throws UnknownHostException {

InetAddress l = null;

InetAddress ip = l;

try {

ip = InetAddress.getLocalHost();

} catch (java.net.UnknownHostException e) {


e.printStackTrace();

}

String localname = ip.getHostName();

String localip = ip.getHostAddress();

System.out.println("本机名: " + localname);

System.out.println("本机IP地址: "+ localip);

}

}

2.2 ServerSocket 类


java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网络上的“请求”。
它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套字。与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。默认大小是50。   

2.3TCP通信

TCP通信方式呢  主要的通讯方式是一对一的通讯方式,也有着优点和缺点  它的优点对比于UDP来说就是更可靠 因为它的通讯方式是需要先发送消息 看看客户端是否能够接收到消息 如果没有回复消息的话 服务端  就不会发出文件 等待客户端回复消息,这个握手模式的话  就会非常可靠  以下代码进行讲解:

主要的通讯方式是一对一的通讯方式,也有着优点和缺点  它的优点对比于UDP来说就是更可靠

21.3UDP程序

用户数据报协议(UDP)是网络信息传输的另一种形式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。使用UDP传递数据时,用户无法知道数据能否正确地到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。虽然UDP是一种不可靠的协议,但如果需要较快地传输信息,并能容忍小的错误,可以考虑使用UDP。
基于 UDP通信的基本模式如下:
☑将数据打包(称为数据包),然后将数据包发往目的地。

☑接收别人发来的数据包,然后查看数据包。

发送数据包的步骤如下:
(1)使用DatagramSocket()创建一个数据包套接字。
(2)使用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)创建要发的数据包。
(3)使用DatagramSocket类的send()方法发送数据包。

接收数据包的步骤如下:

(1)使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口。

(2)使用DatagramPacket(byte[] buf, int length)创建字节数组来接收数据包。

(3)使用DatagramPacket类的receive(方法接收UDP包。

注意

DatagramSocket类的receive()方法接收数据时,如果还没有可以接收的数据,在正常情况下 receive()方法将阻害,一直等到网络上有数据传来,receive()方法接收该数据并返回。如果网络上没有数据发送过来,receive()方法也没有阻塞,肯定是程序有问题,大多数情况下是因为使用了一个被其他程序占用的端口号。

3.1 DatagramPacket类


javanet 包的 DatagramPacket类用来表示数据包。DatagramPacket类的构造方法如下:☑DatagramPacke1(byte]buf, int length).
DatagramPackel(byse[] buf,int length,InetAddress address, int port).
第一种构造方法在创建DatagramPacket对象时,指定了数据包的内存空间和大小。第二种构造方法不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口。在发送数据时,必须指定接收方的Socket地址和端口号,因此使用第二种构造方法可创建发送数据的DatagramPacket对象。

3.2 DatagramSocket 类


java.net 包中的DatagramSocket类用于表示发送和接收数据包的套接字。该类的构造方法如下:☑DatagramSocket()。
☑DatagramSocket(int port)。
DatagramSocket(int port, InetAddress addr)。
第一种构造方法创建DatagramSocket对象,构造数据报套接字,并将其绑定到本地主机任何可用的端口上。第二种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到本地主机的指定端口上。第三种构造方法创建DatagramSocket对象,创建数据报套接字,并将其绑定到指定的端口和指定的本地地址上。第三种构造函数适用于有多块网卡和多个IP地址的情况。

UDP通信:

UDP通信 :主要的方向是一对多通信方式 UDP通信就是一下子可以通信多个对象,这就是UDP对比TCP的优势,UDP它的原理  就是开启服务端 然后客户端依次连接客户端  于TCP不同的是他不会一个一个跟客户端说而是跟微信群聊一样它在给这些客户端发送消息 缺点 :服务端会发送消息给到客户端  但是有些客户端并不会接收到消息, 或者没有看到消息  。这就是UDP的缺点, 不能保证所有客户端都能收到消息。UDP对比于TCP的缺点,就是不能保证每一个人都能够接收到消息 ,但是优点就是可以一下子跟好多个对象进行通信,但是不能保证可靠度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python编程技巧 – 异常处理

Python编程技巧 – 异常处理 Python Programming Skills – Exception Handling By JacksonML 每一个程序都未必是健壮的,有时候很脆弱。只有在人的理想思维状况下,返回的结果才是正确的,如意的。 1. 错误发生及异常输出 面对种种编写有疏…

【mysql】下一行减去上一行数据、自增序列场景应用

背景 想获取if_yc为1连续账期数据 思路 获取所有if_yc为1的账期数据下一行减去上一行账期,如果为1则为连续,不等于1就为断档获取不等于1的最小账期,就是离当前账期最近连续账期 代码 以下为mysql语法: select acct_month f…

机场信息集成系统系列介绍(1)

机场信息集成系统是一种专为机场运营管理设计的先进系统,旨在提高机场的航班调度指挥效率,同时为机场各生产部门提供航班保障计划的制定和实时调整功能。 该系统的核心用户是机场运控部门,他们利用系统进行航班运行指挥,通过采集航…

Kafka性能调优:高吞吐、低延迟的数据流

Apache Kafka作为一种高性能、分布式流处理平台,对于实时数据的处理至关重要。本文将深入讨论Kafka性能调优的关键策略和技术,通过丰富的示例代码为大家提供实际操作指南,以构建高吞吐、低延迟的数据流系统。 Broker 配置的优化 首先&#…

中断、异常和系统调用(2-1,2-2,2-3)

2-1 课堂练习2.1:外部中断 本实训分析 Linux 0.11 对外部中断的响应和处理过程。在每条指令执行的末尾,如果没有关中断,CPU 会检查是否收到了外部中断信号,如果有信号,则 CPU 就切换到核心态去执行对应的中断处理程序…

c# 字段和属性(get、set、init)

基本概念: “字段”就是类内成员变量,一般为了隐藏数据,保护数据,实现对外不可见,体现封装的思想,成员变量都声明为私有变量;“属性”是类内的一种成员,它是一种特殊的方法(方法的意…

文件被删除了怎么恢复?3个宝藏方法,快来get!

“我是一个学生党,期末的一些资料保存在电脑上,但是不知道是不是被我误删了,导致很多文件都找不到了。文件被删除了怎么恢复呢?大家帮我出出主意吧!” 对于经常在电脑上保存各种文件的用户来说,文件误删除是…

万宾科技荣获2023物联网场景应用品牌企业创始人发表专题演讲

12月5日-6日由雄安新区管理委员会、中关村发展集团股份、物联中国团体组织联席会主办,全国33家物联网协会协办的2023物联网产业品牌大会于在雄安新区顺利召开。本次大会以“物联中国.数智雄安”为主题,邀请到科技部原副部长吴忠泽,雄安新区管…

MIT线性代数笔记-第25讲-复习二

目录 25.复习二打赏 25.复习二 已知 a ⃗ [ 2 1 2 ] \vec{a} \begin{bmatrix} 2 \\ 1 \\ 2 \end{bmatrix} a ​212​ ​,求: (1) a ⃗ \vec{a} a 的投影矩阵 (2) a ⃗ \vec{a} a 的投影矩阵的特征值和特征向量 A n s Ans Ans:(1) P a ⃗…

【面试】Java最新面试题资深开发-JVM第二弹

问题三:JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden 和 Survivor 为什么要分成新生代和老年代: 对象生命周期假设: 大多数对象在被创建后很短时间内就会变成垃圾。通过将这些短命的对象放入…

代码混淆技术探究与工具选择

代码混淆技术探究与工具选择 引言 在软件开发中,保护程序代码的安全性是至关重要的一环。代码混淆(Obfuscated code)作为一种常见的保护手段,通过将代码转换成难以理解的形式来提升应用被逆向破解的难度。本文将介绍代码混淆的概…

vue2+datav可视化数据大屏(2)

接上一节所说 我们已经讲骨架搭好 这节我们讲述的如何在vue2中使用mock数据和封装axios 1,项目中使用moke 📓什么是mock?,mock就是假数据,除了数据是假的,其他内容都和正常工作中后端开发的接口都是一致的…

3.PyTorch——常用神经网络层

import numpy as np import pandas as pd import torch as t from PIL import Image from torchvision.transforms import ToTensor, ToPILImaget.__version__2.1.13.1 图像相关层 图像相关层主要包括卷积层(Conv)、池化层(Pool)…

KP 2sv Authenticator一款免费处理亚马逊两步验证码的软件

KP 2sv Authenticator 被誉为一款免费而强大的亚马逊两步验证软件,操作简便轻松。 软件使用方法极为简单,用户只需直接输入身份验证应用程序生成的代码,即可迅速生成随机验证码,帮助用户顺利完成亚马逊的两步验证流程。这款小软件…

dockers安装rabbitmq

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照:dock…

基于个微机器人的开发

简要描述: 下载消息中的动图 请求URL: http://域名/getMsgEmoji 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…

【EXCEL】折线图添加垂直x轴的竖线|画图

相关链接:excel 添加垂直竖向直线 如何在Excel中添加水平和垂直线? 因为加辅助列有点不习惯,已经有分位数横坐标了,想着试下用散点图的误差线画 效果图: 步骤: s1:随便框选两列数据–>插入(…

Android hook式插件化详解

引言 Android插件化是一种将应用程序的功能模块化为独立的插件,并动态加载到主应用程序中的技术。通过插件化,开发者可以将应用程序的功能分解成独立的模块,每个模块可以作为一个插件单独开发、测试和维护,然后通过动态加载的方式集成到主应用程序中,实现功能的动态扩展和…

香港云服务器:全面介绍与使用场景分析

这几年基于国内互联网技术的发展,各类海外贸易的兴起,很多网站都启用了海外云服务。这其中,香港的 IDC 市场异常火爆。也不奇怪,就目前来看,国内大多数网站的访问用户在国内外均有涉及,而香港云服务器恰好满…

linux云服务器开启防火墙注意事件

重要的事情先说三遍: linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! 也就是能打开这个页面: 为什么这么说呢?如果你…