Java网络编程基础复习
一、什么是网络编程?
什么是网络编程?即通过编程使计算机之间能够进行高效快速的数据传输。在按照网络通信协议规范下。不同计算机上运行的程序,进行的数据传输。
应用场景
即时通信(例:微信、QQ 、Facebook等)、网游对战(例:贪玩蓝月,我系渣渣灰)、金融证券、国际贸易、邮件等等,不管什么应用场景都是计算机之间通过网络进行数据传输。
二、常见的软件架构:CS和BS架构
1.CS架构 : 即Client (客户端)/Server(服务器)
CS架构即在用户本地需要安装客户端程序,在远程有一个服务端程序,用户本地需要安装客户端程序安装包、通常安装包的大小取决于应用的功能种类和特点,例如我们熟知的QQ微信等应用,这里以Windows操作系统为例Windowsk客户端的安装包即为200多MB。
2.BS架构 :即Browser (浏览器)/Server (服务器)
BS架构指的是用户与服务器的交互通过浏览器进行,无需安装客户端程序,浏览器可以生胜任应用的主体业务,只需要一个浏览器,用户通过不同的网址可以访问不同的服务器,访问不同的应用。
3.CS/BS模式的特点
CS 模式的应用需要开发客户端,适合定制专业化的办公软件、大型游戏等,例如:IDEA、王者荣耀等,缺点是安装包较大,安装部署维护都较为困难,特别是当应用需要更新时,用户需要重新下载新的装包,较为麻烦。
而BS模式应用无需下载客户端安装包,通过浏览器即可访问,无需开发客户端,只需开发服务端,安装部署和维护较为简单,缺点是应用画面无法做的特别精美,且如果应用过大,用户使用体验大打折扣。
三、网络编程三要素
1.IP
那么,什么是IP呢?IP通俗的说就是计算机在互联网中的地址,是设备在网络中的标识,通过IP可以唯一地确定某一台计算机。从而对该台进行传输数据。
IP的分类和功能:
目前主流的互联网通信协议有IPV4(Internet protocol version 4)和IPV6 (Internet protocol version 4)
IPV4
IPV4 的方案:192.168.1.1点分十制分类法,一共32bit,将32bit通过三个点分成4个8bit,每部分可以表示0~255,故IPV4分配方案的种类共有0.0.0.0~255.255.255.255 一共2的32次方为42多亿,这样的IP个数明显不满足当今世界IP的需求量,IPV4分配的IP数量已在2019年11月26号分配完。 为了解决IPV4提供的IP不够的矛盾。现在常采用公有IP+私有IP混用的形式,即通过将公有IP下的所有电脑再次划分为私有IP,192。168开头的就是私有IP, 范围192.168.0.0 ~ 192.168.255.255,例如网吧的IP分配,多个计算机共用一个公用IP。
IPV6
由于互联网的蓬勃发展,IP地址的需求量越来越大,IPV4模式下的IP的总数是有限的无法满足市场需求,因而诞生了新版本的通信协议IPV6
IPV6采用了32*8=128位比特位,采用冒分十进制法,每4bite可以表示0~15也就是十六进制的0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。4bite一组的冒分十六进制的表示方法可以更加清晰地表示IP,且中间连续的0可以省略表示,如下图。
由于IPV6的位数明显增多,故可表示的IP数相比IPV4有显著增加,最多可表示2的128次个IP,这是一个相当庞大的数字,相当于可以给地球上的每一粒沙子划分IP,足够人类使用。
2.端口号
端口号类似电脑的IP,IP是指在整个互联网中某一台计算机的具体地址,而端口号即指的在在某一台计算机中某个应用的地址,通过端口号可以唯一确定标识一个应用。Windows系统中win+r键输入cmd回车打开控制台输入netstat -ano
指令回车可以查看当前系统运行的应用的端口号。
通过IP找到互联网中指定的某台计算机
通过端口号找到该计算机的指定应用,这样就可以对该应用进行数据传输了。
3.协议
协议指的是数据在互联网中传输的规则,即传输的规范,通过规定好采取具体的协议,发送方和接受方才可以进行稳定且高效的数据传输
常见的协议有UDP、TCP、HTTP、HTTPS等
这里简要概述UDP和TCP协议
UDP(User Datagram Protocol)用户数据报协议
UDP是一种用于网络通信的传输层协议。与传输控制协议(TCP)相对,UDP是一种面向无连接的、不可靠的协议,它提供了简单的数据传输服务,一次直接发送无需接收方反馈,故有不稳定不安全、速度快的特点。
TCP(Transmission Control Protocol)传输控制协议
TCP是一种面向连接的可靠的、基于字节流的可靠的传输层通信协议,是现如今互联网使用最为广泛的协议,通过采用三次握手四次挥手 的连接方式建立连接和断开连接,使得该协议具有可靠性、稳定性、安全性的特点。
TCP通信的三次握手四次挥手
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个报文,四次挥手同理,那么,为什么一定是三次挥手四次握手呢,这就要通过TCP的特性来深入了解。
TCP协议作为一种面向连接 的可靠的通讯协议,需要客户端和服务端都能够确认对方已经达到建立连接的要求,连接请求从客户端发起,客户端接收一次服务端响应请求即可确认服务端已做好链接的准备,而服务端是链接请求的被动方,它不仅需要确认客户端发起了请求,还需要确认客户端已经做好了链接的准备(客户端发起请求不代表已经准备好了链接,否则未确认服务端收到了请求就进行准备可能会造成资源的浪费)当服务端确认客户端发了请求,且已经准备完毕,一共就是三次数据传输即三次握手,三次握手足够双方确认链接,即两次不够,四次太多浪费资源。
TCP作为面向连接 的数据传输协议,数据传输的稳定性和高效性便是重点,TCP的链接和断开有其自身的规则,在尽量保证资源不浪费的情况下完成数据传输的稳定性和完整性。
三次握手图示
四次挥手图示
总结
四、Java网络编程实战
实战1 UDP协议下的一对一聊天简易版
要求:通过网络编程根据UDP协议实现数据的发送和接收,直到输入:see you 结束聊天
分析:UDP协议作为一种面向无连接的通信协议,发送以及接收数据较为直接。
1 创建发送端的DatagramSocket
对象,该对象专门用于处理UDP协议的发送与接收数据,InetAddress
对象的getByName()方法用于根据主机名获取主机IP。127.0.0.1为默认主机名,发送到10086端口 2 将要发送的数据打包为DatagramPacket
对象,该对象专门用于封装UDP协议的数据包
3 发送数据
4 释放资源
发送数据
java
public class SendMessage1 {
public static void main(String[] args) throws IOException {
//创建DatagramSocket(套接字对象)
DatagramSocket datagramSocket = new DatagramSocket();
Scanner scanner = new Scanner(System.in);
while (true) {
//接受要发送的信息
System.out.print("请输入你要发送的消息");
//要发送的数据
String string = scanner.nextLine();
if ("see you".equals(string)) break;
//将字符串转成字符数组
byte[] bytes = string.getBytes();
//设置要接受数据的主机对象
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
//设置要接受数据的端口号
int port = 10086;
//将数据 打包 为datagramPacket(数据包)对象
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,inetAddress,port);
//发送
datagramSocket.send(datagramPacket);
}
//释放资源
datagramSocket.close();
}
}
接受数据
java
public class ReceiveMessage1 {
public static void main(String[] args) throws IOException {
//接收数据
//设置发送端口,同时获取插座对象(DatagramSocket)
//根据接受端口拿到数据
DatagramSocket datagramSocket = new DatagramSocket(10086);
//接受数据包
//工具字符数组
byte[] r = new byte[1024];
//设置准备好接收的数据包的空间
DatagramPacket datagramPacket = new DatagramPacket(r,r.length);
//将接收的数据存入datagramPacket对象中,数据存在该对象的字符数组空间中
while (true) {
datagramSocket.receive(datagramPacket);
//解析数据包
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
//获取发送数据包的主机
InetAddress Inetaddress = datagramPacket.getAddress();
//获取发送数据包的端口
int port = datagramPacket.getPort();
//获取数据包对象
System.out.println("接受到的数据是"+new String(data,0,length));
System.out.println("该数据是从"+Inetaddress+"这台电脑的"+port+"端口发出的");
}
}
}
效果展示
发送数据
接受数据
实战2 TCP协议下的一对一聊天简易版
要求:通过网络编程根据TCP协议实现数据的发送和接收,直到输入:see you 结束聊天
分析:TCP协议作为一种面向有连接的通信协议,发送以及接收数据较为复杂,但在Java编程中封装好了无需操心。
1 创建客户端(发送端)的Socket
对象,该对象专门用于处理TCP协议的发送与接收数据,InetAddress
对象的getByName()方法用于根据主机名获取主机IP。127.0.0.1为默认主机名,发送到10086端口。
2 将要发送的数据放入OutputStream
输出流中 3 将数据写入输入流中发送
4 服务端获取ServerSocket
对象并死等客户端的连接请求,并通过该对象获取连接通道Socket
对象的输入流
5 释放资源
发送数据
java
public class SendMessage2 {
public static void main(String[] args) throws IOException {
//TCP发送数据
//1.获取TCP客户端套接字Socket对象
//细节:在创建对象的同时会连接服务端
//如果连接不上会报错
Socket socket = new Socket("127.0.0.1", 10086);
//2.连接上后可以从连接通道中获取字节输出流
OutputStream outputStream = socket.getOutputStream();
//3.写出数据
outputStream.write("你好".getBytes());
//4.释放资源
//释放字节输出流资源
outputStream.close();
//释放套接字对象资源
socket.close();
}
}
接收数据
java
public static void main(String[] args) throws IOException {
//TCP 接受数据
//1.获取服务端套接字ServerSocket对象
ServerSocket serverSocket = new ServerSocket(10086);
//2.监听客户端连接(死等)接收到客户端请求后会返回一个客户端套接字对象
Socket socket = serverSocket.accept();
//3.从连接通道中(客户端套接字socket对象中)获取字节输入流读取数据
InputStream inputStream = socket.getInputStream();
//将字节流转化为字符流以便查看中文
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
int b;
while ((b = inputStreamReader.read()) !=-1){
System.out.print((char) b);
}
//释放资源
inputStream.close();
serverSocket.close();//关闭服务器(服务器一关,与客户端连接会自动关断开,客户端会自动释放资源)
//socket.close();//断开与客户端连接
}
}
输出
图解