📌 网络编程概述
✍什么是计算机网络?
把分布在不同地理区域的计算机设备, 通过物理线路连接起来,最终实现数据传输, 资源共享.
✍什么是网络编程?
在网络的基础上,开发的程序能够进行数据传输.
java语言是支持网络的, 并且将网络连接的细节都封装起来了,对外提供一套网络库,就可以进行统一环境的网络编程
✍要进行网络数据传输的核心问题?
如何找到网络世界中的目标主机和程序?(IP和端口)
找到后如何高效安全的进行数据传输?(协议)
OK那就让我们带着这两个问题来一探究竟吧!
📌 网络模型
✎ " 理论有七层网络模型-----现实中是四层模型 "
应用层 —— 内容 传输层 —— 加入协议控制
网络层 —— IP 物理层 —— 网线 光纤
📖 网络通信的三要素: IP 端口号 通信协议
○ IP:
- IP地址是指互联网协议地址, 可以理解为计算机的地址 ; 如 ipconfig 局域网IP 192.168 , 本机回环地址127.0.0.1 (访问自己电脑)
○ 端口号:
- 计算机运行的每个程序都对应分配一个整数的编号, 不能重复 ; 范围: 0~65535 ; 一般0~1024已经被系统使用或保留, 例如MySQl的端口号是3306.
📖 端口对应程序 IP对应设备
○ 通信协议:
- 是一种规范和约定,计算机网络中实现通信必须有一些约定,即通信协议;对速率,传输代码,代码结构,出错后如何应对...等制定规则.
📌 TCP协议
✍Transmission Control Protocol 传输控制协议
安全可靠,但传输效率低
① 客户端向服务器端发送数据前,首先要建立连接(测试网络是否通畅)
三次握手
1. 客户端向服务器发送连接请求
2. 当服务器接收到客户端连接请求后,给客户端做出一个回应
3. 客户端为服务器的回应再次做出确认回应
② 正式传输数据
③ 断开时需相互确认
四次挥手
1. 客户端向服务器发送一个断开请求
2. 服务器向客户端做出一个回应
3. 服务器端把没有传完的数据传输完毕,再向客户端做出回应
4. 客户端向服务器端的回应做出回应
断开...
📌 UDP协议
✍User Datagram Protocol 用户数据协议
• 把要发送的数据封装成一个数据包;数据包包含数据、对方的IP、 对方端口。
• 只管发送即可,是否发送成功是不知道的 ( 由于没有建立连接,故发送信息成功与否不晓得 )
优点:不需要建立双方连接,传输速度快.
缺陷:由于没有建立连接,它是不安全的.
📌 TCP网络编程
✎ 搭建服务器
• new ServerSocket(端口)
• ServerSocket中的accept()方法来监听客户端的连接(此时程序阻塞)
try {
//创建服务器对象
ServerSocket serverSocket =new ServerSocket(8888);//(端口)
System.out.println("服务器启动成功!");
//监听客户端是否发送链接请求服务器
Socket socket= serverSocket.accept();//等待监听客户端的连接
System.out.println("有客户连接到了服务器!");
} catch (IOException e) {
e.printStackTrace();
}
✎ 搭建客户端
• new Socket(服务器IP,端口)
try {
//创建客户端
Socket socket = new Socket("127.0.0.1",8888);// ("服务器的IP",端口)
} catch (IOException e) {
e.printStackTrace();
}
✎后续的操作就需要用到IO流了
在客户端输出一个字符串, 并转换为字节的形式写入程序
public static void main(String[] args) {
//创建客户端
try {
Socket socket=new Socket("127.0.0.1",8888);//服务器的IP 端口
String s="你好世界";
OutputStream outputStream=socket.getOutputStream();
outputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
在服务器输入客户端输出的字节,并将其转为字符串进行打印
public static void main(String[] args) {
//创建服务器对象
try {
ServerSocket serverSocket =new ServerSocket(8888);
System.out.println("服务器启动成功!");
//监听客户端是否发送链接请求服务器
Socket socket = serverSocket.accept();//监听客户端的连接
System.out.println("有客户端连接到了服务器");
//后续操作...
InputStream inputStream=socket.getInputStream();
byte[] bytes =new byte[100];
int size =inputStream.read(bytes);
String s =new String(bytes,0,size);
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器启动失败,端口已被占用");
}
}
进阶:实现单线程聊天
○ 我们通过while循环和Scanner控制台输入实现服务器与客户端交替聊天
○ 我们使用包装流DateInputStream,DateOutputStream来输入输出,可以直接读到一个字符串, 无需进行字符串与字节的转换.
/*
服务器
*/
static Scanner scanner =new Scanner(System.in);
public static void main(String[] args) {
try {
//创建服务器
ServerSocket server = new ServerSocket(20049);
System.out.println("服务器启动成功!");
//监听客户端的连接
Socket socket = server.accept();
System.out.println("有客户端连接到了服务器!");
//服务器接收客户端的消息
while (true) {
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
String string = inputStream.readUTF();
System.out.println("服务器:" + string);
//向客户端发送消息
System.out.println("---->客户端:");
String str = scanner.next();
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*
客户端
*/
static Scanner scanner =new Scanner(System.in);
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 20049);
while (true) {
System.out.println("--->服务器:");
String s = scanner.next();
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.writeUTF(s);
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
String string = inputStream.readUTF();
System.out.println("服务器:" + string);
}
} catch (IOException e) {
e.printStackTrace();
}
}
📖 补充:
✎ 本机回环地址:127.0.0.1
✎ 获取服务器的IP ( ipconfig 局域网IP 以 192.168 开头 )