网络:由两台或多台计算机通过网络设备进行串联(网络设备通过传输介质串联)
网络的分类
OSI七层模型
定义:OSI七层模型 (Open System Interconnect),全称为开放系统互连参考模型,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互联参考模型,为开放式互联信息系统提供了一种功能结构的框架。
由于早期计算机厂商使用私有网络模型没有统一标准,因此ISO在1984年颁布了OSI参考模型,将网络分为七层
以下为OSI七层模型数据逐层封装和数据逐层解封的过程
注意:每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
网络连接的核心:TCP/IP协议
TCP/IP协议:TCP/IP协议在一定程度上参考了OSI的体系结构。OSI模型共有七层,但是比较复杂,所以在TCP/IP协议中,它们被简化为了四个层次(或五层),只有四层体系结构的TCP/IP协议,与有七层体系结构的OSI相比要简单了不少,也正是这样,TCP/IP协议在实际的应用中效率更高,成本更低。
设备与层及传输数据单元的对应关系
层 | 传输数据单元(PDU) | 设备 |
应用层 | 原始数据 | 计算机 |
传输层 | 数据段 | 防火墙 |
网络层 | 数据包 | 路由器 |
数据链路层 | 数据帧 | 交换机 |
物理层 | 比特流 | 网卡、网线、集线器 |
物理层(网卡、双绞线)
信号:进行网络通信,在线缆中传输的就是信号,网线传输电信号,光纤传输光信号
信号分类
传输介质
1.同轴电缆
用在网络上传输,做高传输速率达到10mbps
2.双绞线
传输速率高、应用广泛、技术成熟、成本低,分为屏蔽双绞线和非屏蔽双绞线(主要看线用没用屏蔽膜包裹)
以太网接口——RJ-45接口(水晶头)
3.光纤
利用光的全反射原理,传输带宽高,传输距离远,抗干扰能力强
光纤分类
注意:光纤的接入需要光纤模块
4.网卡(NIC)
网卡:也叫网络适配器,网卡是计算机上网不可或缺的一部分,其在计算机网络中所处的位置是数据链路层与物理层,兼顾两层的功能。
注意:每个网卡都具有一个身份标识(MAC地址),该MAC地址具有全球唯一性
网卡的作用:网卡实现的主要功能是物理层与数据链路层的功能,是数据的封装与解封、链路管理、编码与译码;网卡和计算机之间的通信是通过计算机主板上的I/O总线以并行传输方式进行,我们的网卡接入到网络后如果要通信,则需要给他配置ip地址。
mac地址:也称物理地址或硬件地址,由网络制造商生产时写在硬件的内部,其写在电脑的网卡里面。(每个电脑的mac地址都具有全球唯一性)
mac地址由48个二进制/12个16进制数字组成(如下)
计算机的数制
数制:计数的方法
数位:数字符号在一个数中所处的位置
基数:数位上所能使用数字符号的个数
位权:数位所代表的大小
eg:十进制189
数制:10 数位:9所处的数位为10^0
基数:10 位权:10^0位的位权为9
进制计算
二转十:位权展开法
十转二:辗转相除法(除完后将余数从下向上依次列出)
IP协议:IP协议就是将TCP数据包或者UDP数据包的前面加上IP头部,然后将这个加了头部的新的数据包交给网卡,由网卡发送出去就可以了。
ARP协议:(address resolution protocol)地址解析协议,IP地址与MAC地址相比,只是个抽象的产物,将复杂的MAC地址进行了封装,让你以为实际是使用IP地址直接转发的。所以与DNS一样,还需要将IP地址转换为MAC地址来实现转发。这个协议就是ARP协议。
在计算机网络中发送信息,我们只需要填写内容和对方的ip地址操作系统会根据目标ip自动查询arp表来获取对方的mac地址补齐这封信,从网卡发出。
当计算机A想向计算机B发送消息时,操作系统并不会立即发出,其会发送一包arp广播报文出去,询问此IP地址的mac地址是多少此时网络中的所有设备都收到了这个请求报文除了此ip地址以外的设备都会丢弃这个报文只有此ip的设备会回复自己的mac地址是多少,计算机A收到计算机B的mac地址后会先将计算机B的mac地址缓存到arp表中,以便下次使用其后会将这封信补全从网卡发送出去,交换机根据目标mac地址找到计算机B所在的端口从此端口发送出去,计算机B便收到了数据。
一个简化版ip报文处理流程:
IF 报文目标MAC == 网卡MAC
对报文进行路由
IF 报文目标IP匹配本机路由
上送本机传输层
ELSE IF 匹配其他路由
根据路由进行转发
END
END
ip地址:电子设备(计算机)在互联网中的唯一标识,也称逻辑地址。(网络号+主机号)
IP地址的组成
网络部分:用于标识网络的范围
主机部分:用于标识网络范围中的一个节点
注意:网络部分越长,主机部分越短
IP地址的分类(IPV4为例)
IP地址分为A、B、C、D、E五类
A类:确定前8位为网络位后24位为主机位并且以0开头
第一个8位组范围:0——127,由于0代表本地网络,127开头的地址一般用于回路检测,最终范围:0——126
B类:确定前16位为网络位,后16位为主机位,并且以10开头
第一个8位组范围:128——191
C类:确定前24位为网络位,后面8位为主机位,并且以110开头
第一个8位组范围:192——223
网络部分范围:192.0.0——223.225.225
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户 。
网络部分范围:224.0.0.0到239.255.255.255
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。
网络部分范围:240.0.0.0到255.255.255.254,255.255.255.255用于广播地址。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
除去私有IP范围的地址就是公有IP范围的地址
IP地址的对照使用
以ipv4为例:
使用方法:
eg:255.255.255.132
因为255=128+64+32+16+8+4+2+1
132=128+0+0+0+0+4+0+0
推算:11111111.11111111.11111111.10000100
目前IP地址有限,运营商为提高网络容纳能力就出现了动态IP与静态ip。
DHCP协议:(Dynamic Host Configuration Protocol)动态主机配置协议(局域网分配动态ip的实现)该协议无法独立执行,必须在服务器与终端上网设备(客户机)都开启此协议,才能使用此功能。
dhcp协议开启后,当电脑插上网线或手机连上wifi,则操作系统网络协议栈会自动向外发送一包dhcp请求请求为其分配ip地址,路由器获取到dhcp请求后会为其分配一个ip地址,并通过dhcp回复报文发送回去,操作系统收到dhcp回复报文后将其分配的ip配置到网卡上。
静态ip:又称固定ip,是运营商指定的永久ip地址,有固定的地址,一般来说,固定的网站应该是固定ip的,其他特殊网络也会指定用户ip方便用户上网行为的管理。
动态ip:在有互联网连接请求时分配ip地址,连接中断后运营商回收该ip,下次连接互联网时再分配ip,IP地址不确定。
注意:家里的光猫一般通过pppoe(point-to-point protocol over ethernet)协议拨号来获取ip地址
pppoe协议
PPP over Ethernet(PPPoE)协议,是在以太网络中转播PPP帧信息的技术,尤其适用于ADSL等方式。可以使以太网的主机通过一个简单的桥接设备连到一个远端的接入集中器上。通过pppoe协议,远端接入设备能够实现对每个接入用户的控制和计费。
PPPoE协议的作用是:实现有效的用户管理,进行网络接入计费等。
IPV4:IPV4地址表示点分十进制格式,32位地址分成4个8位分组,每个8位以10进制显示,中间用点来分割。
IPV6:IPV6采用16进制格式,即128位地址采用每16位为一个分组,每个16位分组写成4个16进制数,中间用冒号来分16进制格式。
内网ip:路由以内的网络,可以连接互联网,但是互联网无法直接连接内网,如果要连接内网需要做端口映射。
公网ip:互联网的IP地址
作用:可以直接和互联网互通,不需要做端口映射,日常应用如摄像头远程监控、电脑远程开机,主机游戏互联……
子网掩码:ip地址由网络位和主机位组成,子网掩码主要用于区分网络位与主机位。
关于子网掩码
eg:192.168.0.2/30 (说明前面30位二进制数为网络位)
因此子网掩码为:255.255.255.252
网络地址为:192.168.0.0
广播地址为:192.168.0.3
注意:
网段:两个IP地址的网络号相同就说明他们处于同一个网段。
网络地址(网段):其是主机地址全为0的地址,是编码中比较特殊的一部分,它用来表明一个网段,不能分配给主机
广播地址:其是主机地址全为1的地址,其是专门用来向特定网段发送广播的地址,也不能分配给主机;当发出一个目标地址为10.1.1.255(广播地址)的分组封包时,他将被分发给该网段上所有的计算机
子网的划分
为了方便进行网络管理,这时候就需要将一个大的网络分割成多个小网络
子网划分的原因
IP地址划分
子网划分原理 :增加网络部分(向主机位借位)
假设子网位为n,那么可划分的网络个数就为2^n
URL(uniform resoure locator):统一资源定位符,完整的url包含以下内容——协议、网址、文件地址。
DNS(domain name system)域名系统
作用:将注册到dns服务器中的域名解析成为ip地址。
域名:网站的网址,每个域名背后都对应着一个IP地址(因为IP地址不便记忆),用户输入域名,经过dns服务器解析成IP地址来获取该服务。
用高低等级划分域名
WWW:world wide web万维网
端口:应用程序在计算机中的唯一标识
端口可分为虚拟端口和物理端口,其中虚拟端口指的是计算机内部或交换机路由器内的端口,不可见。
源端口(客户机):端口随机
目标端口(服务器):服务器端口
TCP端口范围:0-65535
IP地址和端口的关系
防火墙: 防火墙是系统的第一道防线,其作用是防止非法用户的进入,防火墙是位于内网和外网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出。
防火墙的种类
集线器(物理层)
早期使用的网络为共享式网络,由集线器相连
集线器:集线器的英文称为“Hub”。集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI参考模型第一层,即“物理层”。集线器与网卡、网线等传输介质一样,属于局域网中的基础设备,采用CSMA/CD(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的收发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。
广播域:当集线器中的一个设备向集线器发送信号,则信号将会从集线器其他的所有接口发出
冲突域:连接在集线器中的两台计算机同时通信时就会产生冲突
数据链路层功能
以太网=局域网
以太网标准
以太网的MAC地址:用来标识以太网上某个单独设备或一组设备
互联网的IP地址:用来标识互联网上的某一台主机
一个MAC地址的表示方式:(以二进制形式)前面24位表示厂商编码,后面24位标识序列号。从而实现全球唯一
以太网的帧
交换机(数据链路层设备)
现在使用的网络为交换式网络
交换机:(switch)意为开关是一种用于光电信号转发的网络设备,他的主要作用是把数据包发送到正确的位置。
交换机根据数据包中的目标mac地址直接找到她所对应的物理端口,一台交换机有很多端口,他们都有自己的编号,计算机的网卡通过网线连接到交换机的端口上,这个端口就是一个确定的物理位置,如果知道某个网卡的mac地址我们就能正确的将数据包发送给他,所以在交换机中维护着一张端口与mac地址的映射关系表(mac地址表),想要与某个mac地址通讯时只需要查询一下这个mac地址在哪个端口上然后从对应的端口发送出去即可。
每个数据都会有2个mac地址一个是发送方的mac地址(源mac),一个是接受方的mac地址(目标mac)。
原理 :当交换机收到发来的数据帧后查看帧头部,首先查看源MAC地址有没有记录在自己的MAC表中,如果没有,那么记录;继续查看目标MAC地址,如果没有,就直接从除了自己以外的所有接口群发(广播),只有是此MAC地址的计算机做出回应给交换机,其他计算机丢弃。交换机后发现目标mac地址对应在1号端口上,那么将此mac地址记录在mac表中,直接从1号口进行转发出去。
泛洪: 未查找到目标mac地址则向除了接收端口之外的所有端口群发(如果目标mac地址在这个网络中,则他一定能收到群发的数据包)。
泛洪之后将此mac地址纳入mac地址表进行维护。
因为mac地址处于TCP/IP协议中的第二层(数据链路层)所以交换机通常被称为二层设备,其不关心ip地址。
交换机的工作模式
物理分割与逻辑分割
VLAN
VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。
为什么需要vlan
vlan的实现
将交换机的接口根据业务需要添加到不同的vlan中,从而实现二层隔离
注意:
vlan的成员模式
tcp/ip协议规定不同子网中是不能直接通信的,如果要通信,则需要经过网关。
网关:又称网间连接器、协议转换器。网关在传输层上以实现网络互联,是最复杂的网络互联设备,仅用于两个高层协议不同的网络互联。(简单来说就是网络关隘)
网关实质上是一个网络通向其他网络的ip地址,网关在网段内的可用IP地址中选一个,不过一般用第一个和最后一个。
路由器:连接两个或多个网络的硬件设备,在网络间起着网关的作用,是读取每一个数据包中的地址然后决定如何传送的专用智能性网络设备,路由器里面一般都有两个网卡,用来实现网关的功能。
路由器的2个接口
wan口:连接外网的接口(广域网)
lan口:连接内网的接口(局域网)
这里网关收到数据时将源mac改为自己的mac,将目标mac改为计算机B的mac地址后从路由表中查询。
内网访问外网实现了跨网络访问,这时需要路由器担任网关,路由器担任网关的行为称之为路由。
NAT协议
NAT协议是将IP数据报头中的IP地址转换为另外一个IP地址的过程, 主要用于实现私有网络访问公有网络的功能。这种通过使用少量的IP地址代表较多的私有IP地址的方式,将有助于减少IP地址空间的枯竭
NAT的实现方式
静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。
静态NAT
如果一个内部主机唯一占用一个公网IP,这种方式被称为一对一模型。此种方式下,转换上层协议就是不必要的,因为一个公网IP就能唯一对应一个内部主机。显然,这种方式对节约公网IP没有太大意义,主要是为了实现一些特殊的组网需求。比如用户希望隐藏内部主机的真实IP,或者实现两个IP地址重叠网络的通信。
动态NAT
它能够将未注册的IP地址映射到注册IP地址池中的一个地址。不像使用静态NAT那样,你无需静态地配置路由器,使其将每个内部地址映射到一个外部地址,但必须有足够的公有因特网IP地址,让连接到因特网的主机都能够同时发送和接收分组。
网络地址端口转换NAPT(Network Address Port Translation)
其是把内部地址映射到外部网络的一个IP地址的不同端口上。它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与 动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口号。
NAPT是使用最普遍的一种转换方式,在HomeGW中也主要使用该方式。它又包含两种转换方式:SNAT和DNAT。
SNAT协议:(source network address translation)源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围),这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。
理解:以电脑1向电脑3通信为例
电脑3指定257端口提供服务
当电脑1与电脑3通信时,电脑1开启随机端口(如255)打开连接准备与电脑3建立——(源IP:192.168.1.2,目标IP:30.0.0.2;源端口:255,目标端口:257),因为电脑1的ip为内网ip不能在公网上进行通信,因此到达路由器进行协议地址转换之后路由器将源ip改为自己的公网ip将源端口改为自己的随机端口(如256)——(源IP:30.0.0.1,目标IP:30.0.0.2;源端口:256,目标端口:257)向电脑3发送信息,电脑3收到信息后准备向30.0.0.1地址的256端口进行回复——(源IP:30.0.0.2,目标IP:30.0.0.1;源端口:257,目标端口:256)该地址的路由器收到了回复找到256端口对应的电脑以及对应的端口(192.168.1.2:255)也就是电脑1,将信息发给电脑1,电脑1收到信息后与电脑3断开连接。
DNAT协议: (destination network address translation)目标地址转换,作用是将一组本地内部的地址映射到一组全球地址。
如果我们的内网计算机对外提供服务,则公网上发的请求不能直接到达内网计算机,因此就需要路由器用DNAT技术帮我们转发请求。
过程:
192.168.1.10对外提供服务,监听80端口
访问公网(路由器具体的公网地址:221.8.14.91)的8080端口则转到192.168.1.10的80端口,当访问数据包从wan口进入后路由器执行DNAT修改目标ip为192.168.1.10,修改目标端口为80进而把数据包发给了计算机。
正向代理:系统内部要访问外部网络时,统一通过一个代理服务器把请求转发出去,在外部网络看来就是代理服务器发起的访问,此时代理服务器实现的是正向代理(为用户代理)
反向代理:当外部请求进入系统时,代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,此时代理服务器实现的是反向代理。(为服务器代理)
总结:正向代理是代理服务器代替系统内部来访问外部网络的过程,反向代理是外部请求访问系统时通过代理服务器转发到内部服务器的过程。
VPN:虚拟专用网(Virtual Private Network,VPN)是一种利用公共网络来构建的专用网络技术。用于构建VPN的公共网络包括Internet、帧中继、ATM等。“虚拟”这一概念是相对传统专用网络的构建方式而言的,对于广域网连接,传统的组网方式通过远程拨号连接来实现(光猫-外网不可以访问内网资源),而VPN是利用服务提供商所提供的公共网络来实现远程的广域网连接。
CDN
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。
理解:
要访问的服务器可能距离自己很远,在访问服务器的过程中若服务器距离自己越远,那么经过的节点可能越多,并且,每个节点之间还可能出现阻塞以及丢包的情况,这样就会导致用户体验极差;对于这种情况,因此就有人在世界级别搭建各地服务器网络也就是cdn,在此期间会有很多边缘服务器(接近用户的服务器)为特定用户提供服务,因此用户就可以就近取得所需内容。
cdn负责分发的内容——静态内容、动态内容
cdn的分发流程
push:源服务器把静态内容提前备份给cdn
pull:cdn向源服务器索取相应的静态内容
对于静态内容,源服务器把静态内容提前备份给cdn(push),那么这样在世界各地的用户需要访问网页的时候就近的把静态内容提供给用户,就不需要每次都劳烦服务器,若源服务器没有把静态内容提前备份给cdn那么当用户来访问网页时,cdn就会向原服务器索取相应的静态内容(pull)同时源服务器也可以让cdn备份cdn备份好内容后在提供给用户,因此其他做出请求的用户也可以马上拿到内容了
对于动态内容,有些cdn提供可以运行在cdn上的接口让源服务器用这些cdn的接口,而不是源服务器自己的代码,这样用户便可以直接从cdn上获取动态内容,而不用关心源服务器
cdn的加速:cdn不仅会使用户访问服务器距离变近,加载速度变快,同时在文件层面上也会帮你把文件进行最小化或者压缩文档来提升传输效率
网站访问的实现(BS架构)
浏览器对服务器发起请求,服务器对浏览器做出响应。
HTTP协议:定义了浏览器和客户端之间传输数据的格式,其为网站访问的基础。
HTTP协议特点:
注意:HTTP协议的无状态保证了网站传输的安全性
请求报文:
HTTP中常见的请求方式有8种,其中最常用的便是get和post
get请求:请求参数有限制,请求参数在url?的后面多个请求参数用&号拼接因此不安全,但效率高,get只能传输字符数据,只有一次TCP连接。
post请求:请求参数在请求体中,大小无限制,安全,但效率不高,post传输字符数据与字节数据都可以,其根据浏览器的不同,可有多次TCP连接。
响应报文:
响应状态码:
网络通信
TCP/IP体系结构:网络通信的基础。
通信的2个重要条件:IP+端口(port)
通信协议:设备之间进行数据传输的时候必须遵循一定的规则,这种规则就叫通信协议
TCP协议
传输控制协议(Transmission Control Protocol)
特点:可靠的、面向连接
建立连接:(3次握手)
释放连接:(四次挥手)
UDP协议
数据报协议(User Datagram Protocol)
特点:面向无连接
将数据包进行拆分逐个发送到目的地最终在服务器端做一个汇总(会有丢包问题)
网络编程实现通信——java
类:InetAddress——封装了IP
类:InetSocketAddress——封装了IP、Port
相当于我们直接操作IP、Port不行,必须将其封装成对象操作才可以
注意:InetAddress不能直接创建对象,因为其构造方法权限修饰符为默认,不过他有静态方法可以通过类名直接调用
InetAddress address = InetAddress.getByName("localhost");
System.out.println(address);//域名/IP地址
//getByName()中可以封装ip、域名等可以与ip映射的东西
System.out.println(address.getHostName());//获取域名
System.out.println(address.getHostAddress());//获取ip地址
//关于类InetSocketAddress
InetSocketAddress inetSocketAddress = new InetSocketAddress("192.168.199.217", 8080);
System.out.println(inetSocketAddress.getHostName());//获得域名
System.out.println(inetSocketAddress.getPort());//获得端口号
InetAddress address1 = inetSocketAddress.getAddress();//获得ip地址对象
System.out.println(address1.getHostName());//获得域名
System.out.println(address1.getHostAddress());//获得IP地址
套接字(Socket):应用层获取传输层的协议
传输层的协议:TCP、UDP
TCP协议(需要先开服务器来等待客户端请求)
客户端与服务端双向通信,当客户端输入我想关闭连接时关闭连接
1.客户端
public class Customer {
public static void main(String[] args) throws IOException {
//创建套接字,指定服务器的IP和端口
Socket socket = new Socket("127.0.0.1", 6666);
socket.setSoTimeout(1000000);//设置连接超时时间,以ms为单位
OutputStream outputStream = socket.getOutputStream();//获取输出流用来发送数据
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);//变成可处理字符串的输出流——装饰模式
InputStream inputStream = socket.getInputStream();//获取输入流用来读数据
DataInputStream dataInputStream = new DataInputStream(inputStream);//变成可处理字符串的输入流——装饰模式
String s1="";
while(!s1.equals("关闭")) {
String s = new Scanner(System.in).nextLine();
dataOutputStream.writeUTF(s);//给服务器发送数据——不阻塞
s1 = dataInputStream.readUTF();//读取服务端信息——其为阻塞方法
System.out.println(s1);
}
//以下为关流
dataOutputStream.close();
outputStream.close();
socket.close();
}
}
2.服务端
public class Service {
public static void main(String[] args) throws IOException {
//创建套接字,监听6666端口
ServerSocket serverSocket = new ServerSocket(6666);
//accept()为阻塞方法,等待用户端数据,什么时候收到数据什么时候执行,返回值为客户端socket,接到这个socket后,客户端和服务器才真正建立连接,才真正可以通信了
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();//获取输入流,用来得到客户端数据
DataInputStream dataInputStream = new DataInputStream(inputStream);//利用字符串处理流来读取字符串
OutputStream outputStream = accept.getOutputStream();//获取输出流,用来向客户端写数据
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String s1="";
while(!s1.equals("关闭")) {
String s = dataInputStream.readUTF();//读取客户端数据——其为阻塞方法
System.out.println(s);//信息
if(s.equals("我想关闭连接")){
s1="关闭";
dataOutputStream.writeUTF(s1);
}else {
s1 = new Scanner(System.in).nextLine();
dataOutputStream.writeUTF(s1);//不阻塞
}
}
//以下为关流
dataInputStream.close();
inputStream.close();
accept.close();//客户端socket
serverSocket.close();
}
}//全写好之后运行该服务等待客户端请求
UDP协议(发送方和接收方地位平等)
发送方与接收方双向通信,当发送方输入下次再聊时停止
1.发送方
public class Send {
public static void main(String[] args) throws IOException {
//准备套接字,指定发送方的端口号
DatagramSocket datagramSocket = new DatagramSocket(8888);
String s1="";
while(!s1.equals("bye bye")) {
//发送阶段
//准备数据包
String s = new Scanner(System.in).nextLine();
byte[] bytes = s.getBytes();
//里面传接收方的IP地址对象及端口
DatagramPacket localhost = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 6666);
//向目标地址发送数据包
datagramSocket.send(localhost);//不是阻塞方法
//接收阶段
byte[] b = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
s1 = new String(data, 0, datagramPacket.getLength());
System.out.println(s1);
}
//关流
datagramSocket.close();
}
}
2.接收方
public class Get {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(6666);//指定接收方的端口号
boolean flag=true;
while(flag) {
//接收阶段
//搞一个空数据包用来接收对方传过来的数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
//接收对方发过来的数据包放入datagramPacket数据包中进行填充
datagramSocket.receive(datagramPacket);//其为阻塞方法,接收数据包后,datagramPacket里面的内容就填充好了
//取出数据
byte[] data = datagramPacket.getData();
String s = new String(data, 0, datagramPacket.getLength());//取出特定长度的字节数据转化为字符串类型
System.out.println(s);
if(s.equals("下次再聊")){
DatagramPacket end = new DatagramPacket("bye bye".getBytes(), "bye bye".getBytes().length, InetAddress.getByName("localhost"), 8888);
datagramSocket.send(end);
flag=false;
}else {
//发送阶段
//准备数据包
String s1 = new Scanner(System.in).nextLine();
byte[] b = s1.getBytes();
DatagramPacket localhost = new DatagramPacket(b, b.length, InetAddress.getByName("localhost"), 8888);
//向目标地址发送数据包
datagramSocket.send(localhost);//不是阻塞方法
}
}
//关流
datagramSocket.close();
}
}