【JavaSE 网络编程和日期与时间知识总结】
网络编程
- 一.基本的通信架构
- 二.网络通信三要素
- 三.开放式网络互联标准: OSI网络参考模型
- 四.传输层的2个通信协议
- 1.UDP:用户数据报协议
- 2.TCP: 传输控制协议
- 五.UDP通信的实现
- 六.TCP通信的实现
- 1.实现一个服务端接收多个客户端
- Service
- (1) Client
- (2) 如何模拟多开几个客户端
- 七.时间相关获取方案
- 八.总结
可以让设备中程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信)
一.基本的通信架构
CS架构
BS架构
二.网络通信三要素
ip地址
IP(Internet Protocol)全称: “互联网协议地址”,是分配上网设备的唯一标识别
目前广泛运用的有ipv4,ipv6
端口
- 唯一标识正在计算机设备上运行的进程(程序)
- 两个应用程序他们的端口不能一样否则会出现端口冲突
用来标记正在计算机设备上运行的应用程序,被规定为一个16位的二进制,范围是0~65535
协议
- 网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议
三.开放式网络互联标准: OSI网络参考模型
OSI网络参考模型: 全球网络互联标准
Tcp//IP网络模型: 事实上的国际标准
四.传输层的2个通信协议
1.UDP:用户数据报协议
特点 : 无连接,不可靠连接
不事先建立连接,数据按照包发,一包数据包含: 自己的IP,端口,目的地IP,端口和数据(限制在64KB内)不管对方是否在线,数据中间丢失也不管,如果接收方收到数据也不返回确认,固不可靠
2.TCP: 传输控制协议
特点: 面向连接,可靠通信
三次握手
目的:确保连接的建立
四次挥手断开连接
目的:确保通信双方收发信息都已完成
五.UDP通信的实现
Service
public static void main(String[] args) throws IOException {
//创建一个服务端对象(指定端口)
DatagramSocket ds = new DatagramSocket(8888);
//接收数据
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);
//获取到接收到的有效数据长度
dp.getLength();
String msg = new String(bytes, 0, dp.getLength());
System.out.println(msg);
//关闭资源
ds.close();
}
Client
public static void main(String[] args) throws IOException {
//1.创建一个客户端对象
DatagramSocket ds = new DatagramSocket();
//2.发送数据
String msg = "你好啊";
byte[] bytes = msg.getBytes();
//3.创建数据包对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, new InetSocketAddress("localhost", 8888));
ds.send(dp);
//4.关闭资源
ds.close();
}
六.TCP通信的实现
特点: 面向连接,可靠通信
- 通信双方事先会采用"三次握手"方式建立可靠连接,实现端到端的通信,底层保证数据成功传给服务端
- Java提供了一个java.net.Socket来实现TCP通信
Client
1.实现一个服务端接收多个客户端
Service
- 这里的代码仅仅可以演示,代码可读性不是很好,我们可以专门把线程任务放到一个类中,让线程任务和线程对象分开定义
- 因为通信的soket对象是在Serve这个类中获取的,而线程任务需要使用到socket对象去获取到输入流,这里可以给线任务提供一个有参构造,让Serve里面创建线程任务对象的时候传参
package com.dream.TCP;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
@Slf4j
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888);
//创建一个线程池
ExecutorService pool = new ThreadPoolExecutor(
5,
8,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(10),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
while (true) {
Socket socket = ss.accept();
//包装成缓冲流
pool.submit(() -> {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
try {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println(Thread.currentThread().getName() + "客户端已经断开连接");
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
}
(1) Client
package com.dream.TCP;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888);
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
Scanner sc = new Scanner(System.in);
String line;
while((line = sc.nextLine()) != null ){
if("886".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
}
}
(2) 如何模拟多开几个客户端
第一步:选择你客户端的类,然后点击下面的EditConfugurations…
第二步:选择modified options…
第三步: 勾选Allow multiple instances…
最后apply --------------> “OK”!
七.时间相关获取方案
- LocalDate: 代表本地日期(年月日,星期)
- LocalTime : 代表本地时间(时,分,秒,纳秒)
- LocalDateTime: 代表本地日期,时间(年,月,日,星期,时,分,秒,纳秒)
LocalDate ld = LocalDate.now();
System.out.println(ld);
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalTime lt = LocalTime.now();
System.out.println(lt);
//of
LocalDate ld1 = LocalDate.of(2020, 12, 12);
System.out.println(ld1);
LocalTime lt1 = LocalTime.of(12, 12, 12);
System.out.println(lt1);
LocalDateTime ldt1 = LocalDateTime.of(ld1, lt1);
System.out.println(ldt1);
八.总结
本章主要总结了两种通信方式的优点和劣势,以及在java中的运用,也结合了线程池的技术去优化我们的多个客户端的请求处理,更大的展现了线程池的特点,最后总结了几个我们目前获取时间的常用方法。