📌 网络编程概述
✍什么是计算机网络?
把分布在不同地理区域的计算机设备, 通过物理线路连接起来,最终实现数据传输, 资源共享.
✍什么是网络编程?
在网络的基础上,开发的程序能够进行数据传输.
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 开头 )