网络编程
-
多线程下的单例模式
-
同步代码块
-
防止指令重排
-
-
生产者和消费者
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 + "个产品"); } }
-
网络编程的概述
-
通信双方地址
-
IP
-
端口号
一定的规则(即:网络通信协议)
-
OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
-
TCP/IP参考模型(或TCP/IP协议):事实上的国际标准
端口号
-
端口号标识正在计算机上运行的进程(程序)
-
不同的进程有不同的端口号
-
被规定为一个16位的整数 0~65533
-
端口分类
-
公认端口:0~1023 被预先定义的服务通信占用(如:HTTP占用端口80,FTP占用端口21,Telnet占用端口23)
-
注册端口:1024~49151 分配给用户进程或应用程序。(如:Tomcat占用端口8080,Mysql占用端口3306,Redis占用端口6379,Oracle占用端口1521等)
-
动态/私有端口:49152~65535
-
-
-
端口号与IP地址的组合得出一个网络套接字:Socket
-
-
如何快速定位网络上的一台计算机,和他特定的服务/引用
-
IP—127.0.0.1,localhost
-
ipv4
-
ipv6
-
-
端口号
-
0~65535
-
HTTP 80
-
Tomcat 8080
-
Mysql 3306
-
Redis 6379
-
-
IP+端口号 = Scoket(网络套接字)
-
域名= IP + 端口号的一个映射
-
-
如何快速高效的进行数据传输
-
TCP协议:
-
使用TCP协议之前,必须先建立TCP连接,形成数据传输通道
-
传输前,采用”三次握手“方式,点对点通信,是可靠的
-
TCP协议进行通信的两个应用进程:客户端、服务端
-
在连接中可进行大数据量的传输
-
传输完毕,需释放已建立的连接,效率低
-
-
UDP协议:
-
将数据、源、目的封装成数据包,不需要建立连接
-
每个数据报的大小限制在64K内
-
发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
-
可以广播发送
-
发送数据结束时无需释放资源,开销小,速度快
-
-
-
-
TCP/IP、UDP
-
传输层协议中有两个非常重要的协议:
-
传输控制协议TCP/IP
-
用户数据报协议UDP
-
-
TCP/IP以其两个主要协议:传呼控制协议(TCP)和网络互连协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议
-
IP(Internet Protocol)协议是网络层的主要协议,支持网间互传的数据通信
-
TCP/IP协议模型是从更实用的角度出发,形成了搞笑的四层体系结构,即物理链路层、IP层、传输层和应用层
-
TCP特点:
-
有序
-
可靠
-
能重传
-
需要来回往返
-
-
UDP特点:
-
速度快
-
不保证可靠
-
可能丢包
-
无连接
-
-
-
Socket
客户端程序的工作工程包含以下四个基本的步骤:
-
创建Socket :根据指定服务器端的IP地址或端口号构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路,若连接失败,会出现异常
-
打开连接到Socket的输入/输出流 :使得getInputStream()方法获得输入流,使得getOutputStream()方法获得输出流,进行数据传输
-
按照一定的协议对Socket进行读/写操作 :通过输入流读取服务器放入线路中的信息(但不能读取自己放入线路的信息),通过输入流将信息写入线程
-
关闭Socket :断开客户端到服务器的连接,释放线路
服务器程序的工作工程包含以下四个基本的步骤:
-
调用ServerSocket(int port) : 创建一个服务器端套接字,并绑定到指定端口上,用于监听客户端的请求
-
调用accept() :监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象
-
调用该Socket对象的getOutputStream()和getInputStream() :获取输出流和输入流,开始网络数据的发送和接收
-
关闭ServerSocket和Socket对象 :客户端访问结束,关闭通信套接字
-