线程通信:wait 和 notify和notifyAll() -->同步环境下使用 否则:IllegalMonitorStateException
人车公用街道的案例
- street Person Car
wait():使线程进入等待序列,释放对象锁,让出cpu的资源
notify和notifyAll():唤醒对方处于等待序列的线程,具有可运行的能力,并且要获取对象的锁和cpu的资源才能运行,如果被唤醒的线程没有获取对象锁无法执行
Ex.
/街道
class Street{
//信号灯
boolean flag=false; //false 人走 true 车走
//东西 ->人走
public synchronized void we(){
if(flag==true){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try {
Thread.sleep(1000); //人1000ms走完
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("人走.....");
//变灯
flag=true;
//唤醒对方正在等待的线程,被唤醒的线程,具有了能够被cpu调度的能力,就绪状态
this.notifyAll();
}
}
//南北 ->车走
public synchronized void ns(){
if(flag==false){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车走...");
flag=false;
this.notify();
}
}
}
//人类
class Person implements Runnable{
//资源
Street street=null;
public Person(Street street) {
this.street=street;
}
@Override
public void run() {
while(true){
street.we();
}
}
}
//车
class Car implements Runnable{
//资源
Street street=null;
public Car(Street street) {
this.street=street;
}
@Override
public void run() {
while(true){
street.ns();
}
}
}
IP:定位网络中的不同节点(电子设备:手机,电脑,路由器…)
IPV4 4个字节 32位 IPV6
-
特殊的IP:
192.168.0.0~192.168.255.255 局域网内部使用
127.0.0.1 本地IP
localhost 本地域名
IP和域名: DNS域名解析服务器
InetAddress 此类表示互联网协议 (IP) 地址。 -
端口:区分不同软件
0~65535 2个字节
统一协议下端口不能冲突
设置端口号时尽量越大越好
预留端口号:8000 -
常见端口号:
80: http
8080: tomcat
1521: Oracle
3306: mysql
InetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)。
URL:统一资源定位符 区分不同的资源
互联网的三大基石: http html url
- 协议:
- 域名:
- 端口:
- 资源:
Socket套接字:传输层为应用层开辟的通道(小口子)
不同的协议针对于Socket的实现是不同的
传输层协议之间的区别:
tcp: 相当于打电话 基于面向连接的 安全 基于io流传输 占用资源多,开销大,效率低 3次握手:1.请求 2.回应 3.传输
udp: 相当于写信 非面向连接的 只管发送 不安全 开销小,效率高 大小有限制 一般不超过60k 基于字节数组
UDP
UDP实现Socket编程:
DatagramSocket:定义发送端和接收端
DatagramPacket:数据的包裹
udp实现发送端:基本流程
- 1.DatagramSocket 指定端口 定义发送端 DatagramSocket(int port)
- 2.准备数据 ,转为字节数组
- 3.DatagramPacket 打包
- 4.发送 void send(DatagramPacket p) 从此套接字发送数据报包。
- 5.关闭资源
UDP实现接收端:基本流程
- 1.DatagramSocket 指定端口号 定义接收端
- 2.准备字节数组,进行打包(用来接收数据,把数据接收到包裹里面的字节数据中)
- 3.接收
- 4.处理数据
- 5.关闭
tcp
tcp实现客户端:基本流程
- 1.定义客户端 Socket 指定服务端的ip 端口
- 2.准备数据
- 3.通过io读写
- 4.关闭
tcp实现服务端:基本流程
- 1.定义服务端 ServerSocket
- 2.阻塞式监听
- 3.通过io读写
- 4.关闭