Day 25

1.单例模式

单例:一个类获取多次,只得到一个对象

 1 构造方法私有化

 2 静态变量存储对象

 3 公共的静态方法,用于获取对象

public class Singleton_01 {
	private Singleton_01() {
	}

	// volatile : 防止指令重排
	private volatile static Singleton_01 s = null;

//	public synchronized static Singleton_01 getInstance() {
	public  static Singleton_01 getInstance() {
		if (s == null) {
			synchronized (Singleton_01.class) {
				if (s == null) {
					s = new Singleton_01();
				}
			}
		}
		return s;
	}
}

2.网络编程

Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一 的网络编程环境。
网络编程的目的:

直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有两个主要的问题:
如何准确地定位网络上一台或多台主机;定位主机上的特定的应用,找到主机后如何可靠高效地进行数据传输

3.网络通信

两个要素:IP地址 端口号

IP地址(InetAddress):   唯一的标识 Internet 上的计算机(通信实体)

本地回环地址(hostAddress):127.0.0.1    主机名(hostName):localhost

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

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

端口分类:

             公认端口:0~1023

             注册端口:1024~49151

             动态/私有端口:49152~65535

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

4.网络协议

 传输层协议中有两个非常重要的协议:
 传输控制协议TCP(Transmission Control Protocol)
 用户数据报协议UDP(User Datagram Protocol)。
 TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,  包括多个具有不同功能且互为关联的协议。

     IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
    TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。

TCP:

有序:顺序不会乱

可靠:面向连接 连接成功后才能发送数据

能重传:不丢失数据,假如丢失了,会记录下来重新发送

需求来回往返,简称三次握手

5.TCP服务端

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

 1 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口 上。用于监听客户端的请求。
 2 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信 套接字对象。
 3 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收。
 4 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

public static void main(String[] args) throws Exception {
		// 创建对象,绑定IP和端口
		Socket skt = new Socket("127.0.0.1", 10001);
		// 获取服务端传递的信息
		// 获取输入流
		InputStream is =skt.getInputStream();
		// 转换为字符输入
		InputStreamReader isr = new InputStreamReader(is,"gbk");
		// 转换为字符输入缓冲流
		BufferedReader br = new BufferedReader(isr);
		
		// 给服务端响应信息
		// 获取输出流
		OutputStream os = skt.getOutputStream();
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk"));
		String temp = null;
		Scanner scanner = new  Scanner(System.in);
		while (!(temp = scanner.nextLine()).equals("退出")) {
			pw.println(temp);
			pw.flush();
			System.out.println(br.readLine());
		}
		
		br.close();
		isr.close();
		is.close();
		skt.close();
	}

6.TCP客户端

 客户端Socket的工作过程包含以下四个基本的步骤:
 1 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

  2 打开连接到Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
   3 按照一定的协议对Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
   4 关闭 Socket:断开客户端到服务器的连接,释放线路

public static void main(String[] args) throws Exception {
		// 1 创建对象 开启端口
		ServerSocket ss = new ServerSocket(10001);
		System.out.println("服务器已启动,等待连接...");
		// 执行到这里就会进入等待,等待客户端连接
		// 返回客户端对象
		Socket skt = ss.accept();
		System.out.println("客户端已连接");
		// 给客户端响应信息
		// 获取输出流
		OutputStream os = skt.getOutputStream();
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk"));
		// 获取输入流
		InputStream is = skt.getInputStream();
		// 转换为字符输入
		InputStreamReader isr = new InputStreamReader(is, "gbk");
		// 转换为字符输入缓冲流
		BufferedReader br = new BufferedReader(isr);
		String temp = null;
		while ((temp = br.readLine()) != null) {
			// 得到客户端数据
			System.out.println("客户端发来消息 : "+temp);
			// 向客户端发送数据
			pw.println("您的反馈 '"+temp+"' 我们已收到,尽快给您答复.");
			pw.flush();
		}

		// 先开启的,后关闭
		pw.close();
		os.close();
		skt.close();
		ss.close();
		System.out.println("服务器已关闭");
	}

	public static void test() throws Exception {

		// 1 创建对象 开启端口
		ServerSocket ss = new ServerSocket(10001);
		System.out.println("服务器已启动,等待连接...");
		// 执行到这里就会进入等待,等待客户端连接
		// 返回客户端对象
		Socket skt = ss.accept();
		System.out.println("客户端已连接");
		// 给客户端响应信息
		// 获取输出流
		OutputStream os = skt.getOutputStream();
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "gbk"));
		pw.println("你好吗?");
		pw.println("吃了吗");
		pw.flush();

		// 先开启的,后关闭
		pw.close();
		os.close();
		skt.close();
		ss.close();
		System.out.println("服务器已关闭");

	}

7.UDP协议

UDP:速度快,不保证可靠,可能丢包,无连接

  类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
   UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
   DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP  地址和端口号以及接收端的IP地址和端口号。
  UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。

8.UDP客户端

public static void main(String[] args) throws Exception{
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		// 1 字节数组流 --> 数据流写出到字节数组流 --> 字节数组
		// 2 字节数组 --> 转换为字节数组流 --> 数据流读取字节数组流中的数据
		while (string != null && !string.equalsIgnoreCase("exit")) {
			// 把数据转换为字节数组流
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			// 转换为数据流,用于数据传递
			DataOutputStream dos = new DataOutputStream(bos);
			// 把字符串写进数据流
			dos.writeUTF(string);
			// 转换为字节数组
			byte[] bytes = bos.toByteArray();
			// 服务端地址和端口  就是数据包发送到哪里去
			InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 10001);
			// 数据传递,打包
			DatagramPacket dp = new DatagramPacket(bytes, bytes.length,inetSocketAddress);
			// 传输 需要开启客户端端口
			DatagramSocket ds = new DatagramSocket(9999);
			// DatagramPacket  : 数据包
			// DatagramSocket : 进行数据通信
			// 发送
			ds.send(dp);
			ds.close();
			System.out.println("请输入传递的信息");
			string = scanner.nextLine();
		}
	}

9.UDP服务端

public static void main(String[] args) throws Exception{
		// 1 打开UDP对象,并监听端口
		DatagramSocket ds = new DatagramSocket(10001);
		// 保存数据的字节数组
		byte[] bytes = new byte[1024];
		// 包接收器
		DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
		while (true) {
			// 通过开启的端口 接收数据
			ds.receive(dp);
			// 转换为字节数组流
			ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
			// 使用数据流读取数据
			DataInputStream bis = new DataInputStream(bais);
			// 读取数据
			String data = bis.readUTF();
			System.out.println(data);
		}
	}

10.区别

  TCP协议:
⦁    使用TCP协议前,须先建立TCP连接,形成传输数据通道
⦁    传输前,采用“三次握手”方式,点对点通信,是可靠的
⦁    TCP协议进行通信的两个应用进程:客户端、服务端。
⦁    在连接中可进行大数据量的传输
⦁    传输完毕,需释放已建立的连接,效率低
  UDP协议:
⦁    将数据、源、目的封装成数据包,不需要建立连接
⦁    每个数据包的大小限制在64K内
⦁    发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
⦁    可以广播发送
⦁    发送数据结束时无需释放资源,开销小,速度快
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值