likes
comments
collection
share

Java网络编程基础

作者站长头像
站长
· 阅读数 5

Java网络编程基础

一、什么是网络编程?

什么是网络编程?即通过编程使计算机之间能够进行高效快速的数据传输。在按照网络通信协议规范下。不同计算机上运行的程序,进行的数据传输。

应用场景

即时通信(例:微信、QQ 、Facebook等)、网游对战(例:贪玩蓝月,我系渣渣灰)、金融证券、国际贸易、邮件等等,不管什么应用场景都是计算机之间通过网络进行数据传输。 Java网络编程基础

二、常见的软件架构:CS和BS架构

1.CS架构: 即Client(客户端)/Server(服务器)

CS架构即在用户本地需要安装客户端程序,在远程有一个服务端程序,用户本地需要安装客户端程序安装包、通常安装包的大小取决于应用的功能种类和特点,例如我们熟知的QQ微信等应用,这里以Windows操作系统为例Windowsk客户端的安装包即为200多MB。

Java网络编程基础 2.BS架构:即Browser(浏览器)/Server(服务器) BS架构指的是用户与服务器的交互通过浏览器进行,无需安装客户端程序,浏览器可以生胜任应用的主体业务,只需要一个浏览器,用户通过不同的网址可以访问不同的服务器,访问不同的应用。

Java网络编程基础 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号分配完。 Java网络编程基础 为了解决IPV4提供的IP不够的矛盾。现在常采用公有IP+私有IP混用的形式,即通过将公有IP下的所有电脑再次划分为私有IP,192。168开头的就是私有IP, 范围192.168.0.0 ~ 192.168.255.255,例如网吧的IP分配,多个计算机共用一个公用IP。

Java网络编程基础

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可以省略表示,如下图。 Java网络编程基础 由于IPV6的位数明显增多,故可表示的IP数相比IPV4有显著增加,最多可表示2的128次个IP,这是一个相当庞大的数字,相当于可以给地球上的每一粒沙子划分IP,足够人类使用。

2.端口号

端口号类似电脑的IP,IP是指在整个互联网中某一台计算机的具体地址,而端口号即指的在在某一台计算机中某个应用的地址,通过端口号可以唯一确定标识一个应用。Windows系统中win+r键输入cmd回车打开控制台输入netstat -ano 指令回车可以查看当前系统运行的应用的端口号。

Java网络编程基础 通过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网络编程基础

四次挥手图示

Java网络编程基础

总结

Java网络编程基础

四、Java网络编程实战

实战1 UDP协议下的一对一聊天简易版

要求:通过网络编程根据UDP协议实现数据的发送和接收,直到输入:see you 结束聊天 分析:UDP协议作为一种面向无连接的通信协议,发送以及接收数据较为直接。 1创建发送端的DatagramSocket对象,该对象专门用于处理UDP协议的发送与接收数据,InetAddress对象的getByName()方法用于根据主机名获取主机IP。127.0.0.1为默认主机名,发送到10086端口 2将要发送的数据打包为DatagramPacket对象,该对象专门用于封装UDP协议的数据包 3发送数据 4释放资源 发送数据

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();
    }
}

接受数据

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+"端口发出的");
        }
    }
}

效果展示

发送数据

Java网络编程基础

接受数据

Java网络编程基础

实战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释放资源 发送数据

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();

    }

}

接收数据

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



}

输出

Java网络编程基础

图解 Java网络编程基础