多线程下的单例模式、网络编程

网络编程

  1. 多线程下的单例模式

    1. 同步代码块

    2. 防止指令重排

  2. 生产者和消费者

    package com.lxh.process.day_25;
    ​
    /**
     * @author lixuanhui
     * @date 2022年 10月11日 10:41:54
     */
    public class ProduceConsume {
        public static void main(String[] args) {
            Factory factory = new Factory();
            Thread t1 = new ProduceTest(factory);
            Thread t2 = new Thread(new ConsumeTest(factory));
            t1.start();
            t2.start();
        }
    }
    ​
    class ProduceTest extends Thread {
        Factory factory;
        int count = 0;
    ​
        public ProduceTest() {
        }
    ​
        public ProduceTest(Factory factory) {
            this.factory = factory;
        }
    ​
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                factory.Pro((char) (count + 'a'));
                count++;
            }
        }
    }
    ​
    class ConsumeTest implements Runnable {
        Factory factory;
    ​
        public ConsumeTest() {
        }
    ​
        public ConsumeTest(Factory factory) {
            this.factory = factory;
        }
    ​
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                factory.Con();
            }
        }
    }
    ​
    class Factory {
        char[] data = new char[10];
        int count = 0;
    ​
        public synchronized void Pro(char c) {
            if (count == data.length) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (count == 0) {
                this.notifyAll();
            }
            data[count] = c;
            count++;
            System.out.println("生产了" + c + ",目前有" + count + "个产品");
        }
    ​
        public synchronized void Con() {
            if (count == 0) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (count < data.length) {
                this.notifyAll();
            }
            count--;
            char c = data[count];
            System.out.println("消费了" + c + ",目前有" + count + "个产品");
        }
    }
  3. 网络编程的概述

    1. 通信双方地址

      • IP

      • 端口号

        一定的规则(即:网络通信协议)

      • OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广

      • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准

      端口号

      1. 端口号标识正在计算机上运行的进程(程序)

        1. 不同的进程有不同的端口号

        2. 被规定为一个16位的整数 0~65533

        3. 端口分类

          • 公认端口:0~1023 被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)

          • 注册端口:1024~49151 分配给用户进程或应用程序。(如:Tomcat占用端口8080,Mysql占用端口3306,Redis占用端口6379,Oracle占用端口1521等)

          • 动态/私有端口:49152~65535

      2. 端口号与IP地址的组合得出一个网络套接字:Socket

    2. 如何快速定位网络上的一台计算机,和他特定的服务/引用

      • IP—127.0.0.1,localhost

        • ipv4

        • ipv6

      • 端口号

        • 0~65535

        • HTTP 80

        • Tomcat 8080

        • Mysql 3306

        • Redis 6379

      • IP+端口号 = Scoket(网络套接字)

      • 域名= IP + 端口号的一个映射

    3. 如何快速高效的进行数据传输

      1. TCP协议:

        • 使用TCP协议之前,必须先建立TCP连接,形成数据传输通道

        • 传输前,采用”三次握手“方式,点对点通信,是可靠的

        • TCP协议进行通信的两个应用进程:客户端、服务端

        • 在连接中可进行大数据量的传输

        • 传输完毕,需释放已建立的连接,效率低

      2. UDP协议:

        • 将数据、源、目的封装成数据包,不需要建立连接

        • 每个数据报的大小限制在64K内

        • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的

        • 可以广播发送

        • 发送数据结束时无需释放资源,开销小,速度快

  4. TCP/IP、UDP

    1. 传输层协议中有两个非常重要的协议:

      1. 传输控制协议TCP/IP

      2. 用户数据报协议UDP

    2. TCP/IP以其两个主要协议:传呼控制协议(TCP)和网络互连协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议

    3. IP(Internet Protocol)协议是网络层的主要协议,支持网间互传的数据通信

    4. TCP/IP协议模型是从更实用的角度出发,形成了搞笑的四层体系结构,即物理链路层、IP层、传输层和应用层

    5. TCP特点:

      • 有序

      • 可靠

      • 能重传

      • 需要来回往返

    6. UDP特点:

      • 速度快

      • 不保证可靠

      • 可能丢包

      • 无连接

  5. Socket

    客户端程序的工作工程包含以下四个基本的步骤:

    1. 创建Socket :根据指定服务器端的IP地址或端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路,若连接失败,会出现异常

    2. 打开连接到Socket的输入/输出流 :使得getInputStream()方法获得输入流,使得getOutputStream()方法获得输出流,进行数据传输

    3. 按照一定的协议对Socket进行读/写操作 :通过输入流读取服务器放入线路中的信息(但不能读取自己放入线路的信息),通过输入流将信息写入线程

    4. 关闭Socket :断开客户端到服务器的连接,释放线路

    服务器程序的工作工程包含以下四个基本的步骤:

    1. 调用ServerSocket(int port) : 创建一个服务器端套接字,并绑定到指定端口上,用于监听客户端的请求

    2. 调用accept() :监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象

    3. 调用该Socket对象的getOutputStream()和getInputStream() :获取输出流和输入流,开始网络数据的发送和接收

    4. 关闭ServerSocket和Socket对象 :客户端访问结束,关闭通信套接字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值