线程通信:
wait() 和 notify()通过操作同一份资源控制线程的通信,方法必须使用在同步的环境下
wait()进入到对象(资源)的等待池中排队等待,等待被唤醒,会让出cpu的资源,同时也会释放对象的锁
sleep() 让出cpu的资源,不会释放对象的锁
notify() 唤醒正在等待的线程,只是具备了可执行的能力,就绪状态,如果想要执行,除了获取cpu的资源以外,还要拿到对象的锁
生产者消费者模式:
信号灯法:
人车共用街道
一条街道,有一个信号灯 通过信号灯来控制 人南北 ns true 车东西 we true
public class Xian extends Object {
public static void main(String[] args) {
Street str=new Street();
new Thread(new Person(str)).start();
new Thread(new Car(str)).start();
}
}
class Street{
boolean flag=false;
public void we(){
//
if (flag==true) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("车走。。。。");
flag=true;
this.notify();
}
}
//
public void ns(){
if (flag==false) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("renzou...");
flag=false;
this.notify();
}
}
}
class Person implements Runnable{
Street str=null;
public Person(Street str) {
// TODO Auto-generated constructor stub
super();
this.str=str;
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (str) {
while(true){
str.ns();
}
}
}
}
class Car implements Runnable{
Street str=null;
public Car (Street str){
super();
this.str=str;
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (str) {
while (true) {
str.we();
}
}
网络编程:
IP:定位网络上的节点,电脑,手机,服务器,路由器…(电子设备)
网络中的IP重要分为2大类:
IPV4 32
IPV6 128
特殊的ip:
192.168.0.0~192.168.255.255 非注册IP,供组织内部使用
127.0.0.1 本地IP
localhost: 本地域名
ip与域名 DNS服务器
java中如何表示IP:
InetAddress 这个类代表一个互联网协议(IP)地址。
端口:区分软件
url:定位资源 统一资源定位符
协议: 协议就是交流方式, 更畅通,更标准,更规范
传输协议: 传输数据满足传输协议
tcp:相当于打电话 ***
udp:相当于写信
端口:区分软件
- 统一协议下端口不能冲突 tcp udp
- 0~65535 2个字节 表示端口
- 建议使用8000以上的端口号自定义
- 预留端口号:
-
80: http
-
8080: tomcat
-
1521: oracle
-
3306: mysql
- 在java中表示端口: InetSocketAddress IP地址+端口号
URL: 统一资源定位符
- 互联网的三大基石: url html http
- 协议: http
- 域名:www.baidu.com
- 端口:80
- 资源:index.html
- 数据:uname=zhangsan&pwd=123
- 锚点:#a
- “http://www.baidu.com:80/index.html?uname=zhangsan&pwd=123#a”
- java中表示url:
- URL
面向Socket套接字编程:
- socket就是传输层为引用层开辟的小口子
- tcp和udp对socket的实现不同
- udp: 发信息,非面向连接 不安全 协议简单,开销小,效率高 大小有限制,一般不超过60k
- tcp: 打电话,面向连接 安全,效率低 基于3次握手: 1.拨号 2.相应,连接上 3.发送数据
- udp: 基于字节数组
-
DatagramSocket
-
DatagramPacket
- udp实现基本流程: 发送端
- 1.定义发送端
-
DatagramSocket(int port) 构造一个数据报套接字绑定到本地主机上的指定端口。
- 2.准备数据
- 3.给数据打包
-
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造一个数据报包发送数据包的长度 length指定主机上的指定端口号。
- 4.发送
- 5.关闭
public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("------------------发送端-------------------");
//1.定义发送端
DatagramSocket client= new DatagramSocket(8888);
//2.数据
byte[] str="因为哈哈".getBytes();
//3.打包
DatagramPacket packet=new DatagramPacket(str,str.length,new InetSocketAddress("localhost", 9999));
//4.发送
client.send(packet);
//5.关闭
client.close();
}
}
udp实现基本流程: 接收端
- 1.定义接收端
- 2.准备盒子接收数据
-
DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket length接收数据包的长度。
- 3.接收 receive(packet)
- 4.关闭
public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("------------------接收端-------------------");
//1.定义接收端
DatagramSocket server= new DatagramSocket(9999);
//2.准备一个字节数组,打包
byte[] car=new byte[1024];
DatagramPacket packet=new DatagramPacket(car,car.length);
//3.接收
server.receive(packet);
//处理数据
/*
byte[] getData()
返回数据缓冲区。
int getLength()
返回数据的长度发送或接收到的数据的长度。
*/
byte[] datas=packet.getData();
int length=packet.getLength();
System.out.println(new String(datas,0,length));
//5.关闭
server.close();
}
}
tcp实现基本流程: 客户端
- 1.定义客户端 Socket Socket(String host, int port) 创建一个流套接字连接到指定主机上的指定端口号。
- 2.准备数据
- 3.写出 IO操作
- 4.关闭
public class Client01 {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("-------------Client-----------");
//1.定义客户端 Socket Socket(String host, int port)
Socket client=new Socket("127.0.0.1",7777);
//2.准备数据
String str="name=zhangsan&pwd=123";
//3.写出 IO操作
DataOutputStream data=new DataOutputStream(client.getOutputStream());
data.writeUTF(str);
data.flush();
//4.关闭
data.close();
client.close();
}
}
* tcp实现基本流程: 服务端
* 1.定义服务端 ServerSocket ServerSocket(int port) 创建一个服务器套接字绑定到指定端口。
* 2.阻塞式监听 Socket accept() 监听连接套接字并接受它。
* 3.io操作
* 4.关闭
public class Server02 {
public static void main(String[] args) throws IOException {
System.out.println("-------------Server-----------");
//1.定义服务端
ServerSocket server=new ServerSocket(7777);
//2.阻塞式监听 Socket accept()
Socket client=server.accept();
//3.io操作
DataInputStream in=new DataInputStream( client.getInputStream());
String str=in.readUTF();
System.out.println(str);
//4.关闭
in.close();
client.close();
server.close();
}
}
}
}