Java网络编程复习

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();//断开与客户端连接
    }



}

输出

图解

相关推荐
luckywuxn1 分钟前
EurekaServer 工作原理
java·eureka
壹米饭4 分钟前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
java金融6 分钟前
Java 锁升级机制详解
java
Young55669 分钟前
还不了解工作流吗(基础篇)?
java·workflow·工作流引擎
让我上个超影吧11 分钟前
黑马点评【缓存】
java·redis·缓存
ajassi200019 分钟前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
YuTaoShao33 分钟前
Java八股文——MySQL「存储引擎篇」
java·开发语言·mysql
crud39 分钟前
Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法
java
王德博客44 分钟前
【Java课堂笔记】Java 入门基础语法与面向对象三大特性详解
java·开发语言
seventeennnnn1 小时前
Java大厂面试真题:谢飞机的技术挑战
java·spring boot·面试·aigc·技术挑战·电商场景·内容社区