线程通信:网络编程

线程通信:
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();
	}
}	



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值