当前位置: 首页 > article >正文

【JavaSE 网络编程和日期与时间知识总结】

网络编程

  • 一.基本的通信架构
  • 二.网络通信三要素
  • 三.开放式网络互联标准: OSI网络参考模型
  • 四.传输层的2个通信协议
    • 1.UDP:用户数据报协议
    • 2.TCP: 传输控制协议
  • 五.UDP通信的实现
  • 六.TCP通信的实现
    • 1.实现一个服务端接收多个客户端
      • Service
      • (1) Client
      • (2) 如何模拟多开几个客户端
  • 七.时间相关获取方案
  • 八.总结

可以让设备中程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信)

一.基本的通信架构

CS架构
在这里插入图片描述
BS架构
在这里插入图片描述

二.网络通信三要素

ip地址

IP(Internet Protocol)全称: “互联网协议地址”,是分配上网设备的唯一标识别
目前广泛运用的有ipv4,ipv6

端口

  • 唯一标识正在计算机设备上运行的进程(程序)
  • 两个应用程序他们的端口不能一样否则会出现端口冲突
    用来标记正在计算机设备上运行的应用程序,被规定为一个16位的二进制,范围是0~65535
    在这里插入图片描述

协议

  • 网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议
    在这里插入图片描述

三.开放式网络互联标准: OSI网络参考模型

OSI网络参考模型: 全球网络互联标准
Tcp//IP网络模型: 事实上的国际标准
在这里插入图片描述

四.传输层的2个通信协议

1.UDP:用户数据报协议

特点 : 无连接,不可靠连接
不事先建立连接,数据按照包发,一包数据包含: 自己的IP,端口,目的地IP,端口和数据(限制在64KB内)不管对方是否在线,数据中间丢失也不管,如果接收方收到数据也不返回确认,固不可靠

2.TCP: 传输控制协议

特点: 面向连接,可靠通信
在这里插入图片描述

三次握手
目的:确保连接的建立
在这里插入图片描述
四次挥手断开连接
目的:确保通信双方收发信息都已完成
在这里插入图片描述

五.UDP通信的实现

在这里插入图片描述
Service

public static void main(String[] args) throws IOException {
        //创建一个服务端对象(指定端口)
        DatagramSocket ds = new DatagramSocket(8888);


        //接收数据
        byte[] bytes = new byte[1024];

        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);

        //获取到接收到的有效数据长度
        dp.getLength();
        String msg = new String(bytes, 0, dp.getLength());
        System.out.println(msg);
		//关闭资源
		ds.close();
    }

Client

public static void main(String[] args) throws IOException {
        //1.创建一个客户端对象
        DatagramSocket ds = new DatagramSocket();

        //2.发送数据
        String msg = "你好啊";
        byte[] bytes = msg.getBytes();
        //3.创建数据包对象
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("localhost", 8888));
        ds.send(dp);

        //4.关闭资源
        ds.close();
    }

六.TCP通信的实现

特点: 面向连接,可靠通信

  • 通信双方事先会采用"三次握手"方式建立可靠连接,实现端到端的通信,底层保证数据成功传给服务端
  • Java提供了一个java.net.Socket来实现TCP通信
    Client
    在这里插入图片描述

1.实现一个服务端接收多个客户端

Service

  • 这里的代码仅仅可以演示,代码可读性不是很好,我们可以专门把线程任务放到一个类中,让线程任务和线程对象分开定义
  • 因为通信的soket对象是在Serve这个类中获取的,而线程任务需要使用到socket对象去获取到输入流,这里可以给线任务提供一个有参构造,让Serve里面创建线程任务对象的时候传参
package com.dream.TCP;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

@Slf4j
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8888);
        //创建一个线程池
        ExecutorService pool = new ThreadPoolExecutor(
                5,
                8,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        while (true) {
            Socket socket = ss.accept();
            //包装成缓冲流
            pool.submit(() -> {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    while (true) {
                        try {
                            String line = br.readLine();
                            System.out.println(line);
                        } catch (IOException e) {
                            System.out.println(Thread.currentThread().getName() + "客户端已经断开连接");
                            break;
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

(1) Client

package com.dream.TCP;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        OutputStream os = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        Scanner sc = new  Scanner(System.in);
        String line;
        while((line = sc.nextLine()) != null ){
            if("886".equals(line)){
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    }
}

(2) 如何模拟多开几个客户端

第一步:选择你客户端的类,然后点击下面的EditConfugurations…
在这里插入图片描述
第二步:选择modified options…在这里插入图片描述
第三步: 勾选Allow multiple instances…在这里插入图片描述
最后apply --------------> “OK”!

七.时间相关获取方案

  • LocalDate: 代表本地日期(年月日,星期)
  • LocalTime : 代表本地时间(时,分,秒,纳秒)
  • LocalDateTime: 代表本地日期,时间(年,月,日,星期,时,分,秒,纳秒)
    在这里插入图片描述
LocalDate ld = LocalDate.now();
        System.out.println(ld);
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        LocalTime lt = LocalTime.now();
        System.out.println(lt);


        //of
        LocalDate ld1 = LocalDate.of(2020, 12, 12);
        System.out.println(ld1);
        LocalTime lt1 = LocalTime.of(12, 12, 12);
        System.out.println(lt1);
        LocalDateTime ldt1 = LocalDateTime.of(ld1, lt1);
        System.out.println(ldt1);

八.总结

本章主要总结了两种通信方式的优点和劣势,以及在java中的运用,也结合了线程池的技术去优化我们的多个客户端的请求处理,更大的展现了线程池的特点,最后总结了几个我们目前获取时间的常用方法。


http://www.kler.cn/a/404604.html

相关文章:

  • ant-design-vue中table组件多列排序
  • 【前端】JavaScript中的indexOf()方法详解:基础概念与背后的应用思路
  • WPF里面的C1FlexGrid表格控件添加RadioButton单选
  • Excel - VLOOKUP函数将指定列替换为字典值
  • 09.事件风暴
  • 如何使用PCL处理ROS Bag文件中的点云数据并重新保存 ubuntu20.04
  • Java Web应用中的跨站请求伪造(CSRF)防御策略
  • 关于一次开源java spring快速开发平台项目RuoYi部署的记录
  • hj 212 协议解包php解包,
  • 从0开始的数据结构速过——番外(1)
  • ubuntu20.04如何升级python3.8到python3.10
  • React 组件中 State 的定义、使用及正确更新方式
  • 本地git多用户ssh配置
  • Adobe XD文件处理:即时设计的在线解决方案
  • 腾讯云存储COS上传视频报错
  • vue3+ant design vue带勾选表格的坑,记录一下
  • Android开发实战班 - 第一部分:Android开发基础
  • 李沐学习安装d2l、gpu-pytorch
  • Android Google登录接入
  • 【Amazon】亚马逊云科技Amazon DynamoDB 实践Amazon DynamoDB
  • windows下编译ffmpeg4.4版本
  • Redis分布式锁的原理与Redisson实现
  • Python解析视频FPS(帧率)、分辨率信息
  • Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
  • p2p网络介绍
  • 编程语言的前后端分离:可用JavaScript运行时作为后端的语言及与传统编程语言的对比 -Typescript、Nim、Moonbit