java学习之—网络编程
一、概述
1. 网络编程的目的
无线电台;传播交换信息;数据交换;通信。。。
2. 网络编程的条件
1、如何准确的定位网络上的一台主机 192.168.165.12:端口
,定位到这个计算机上的某个资源;
2、找到了这个主机,如何进行通信呢?
**javaweb:**网络编程;B/S
**网络编程:**TCP/IP;C/S
二、网络通信的要素
如何实现网络通信?
通信双方地址:
- ip;
- 端口号;
- 192.168.16.124:5900。
规则:网络通信的协议
TCP/IP参考模型:
OSI七层模型 | 功能 | 对应的网络协议 | TCP/IP四层概念模型 |
---|---|---|---|
应用层 | 文件传输,文件管理,电子邮件的信息处理——apdu | HTTP、TFTP, FTP, NFS, WAIS、SMTP | 应用层 |
表示层 | 确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密,最小单位——ppdu | Telnet, Rlogin, SNMP, Gopher | |
会话层 | 负责在网络中的两节点建立,维持和终止通信,在一层协议中,可以解决节点连接的协调和管理问题。包括通信连接的建立,保持会话过程通信连接的畅通,两节点之间的对话,决定通信是否被终端一斤通信终端是决定从何处重新发送,最小单位——spdu | SMTP, DNS | |
传输层 | 定义一些传输数据的协议和端口。传输协议同时进行流量控制,或是根据接收方接收数据的快慢程度,规定适当的发送速率,解决传输效率及能力的问题——tpdu | TCP, UDP | 传输层 |
网络层 | 控制子网的运行,如逻辑编址,分组传输,路由选择最小单位——分组(包)报文 | IP, ICMP, ARP, RARP, AKP, UUCP | 网络层 |
数据链路层 | 主要是对物理层传输的比特流包装,检测保证数据传输的可靠性,将物理层接收的数据进行MAC(媒体访问控制)地址的封装和解封装,也可以简单的理解为物理寻址。交换机就处在这一层,最小的传输单位——帧 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP,STP。HDLC,SDLC,帧中继 | 数据链路层 |
物理层 | 定义物理设备的标准,主要对物理连接方式,电气特性,机械特性等制定统一标准,传输比特流,因此最小的传输单位——位(比特流) | IEEE 802.1A, IEEE 802.2到IEEE 802. |
- 小结:
1、网络编程中有两个主要的问题:
1)如何准确的定位到网络上的一台或者堕胎主机;
2)找到注解之后如何进行通信。
2、网络编程中的要素:
1)IP和端口号;
2)网络通信协议。
3、万物皆对象
三、IP
ip地址:InetAddress—唯一定位一台网络上的主机
-
ip可以唯一定位一台网络主机;
-
本地ip:127.0.0.1 localhost-本地主机
-
ip地址的分类:
-
ipv4/ipv6
- ==IPV4:==127.0.0.1, 4个字节组成, 0~255; 42亿,11年已经用尽;
- IPV6: fe80::9827:677f:ec7d:ac0d%2, 128位; 8个无符号整数 abcde
2001:0bb2:aaaa:0015:0000:1001:1aaa:1312 // ipV6示例(纯属虚构)
-
公网(互联网)-私网(局域网)
- ABCD类地址
- 192.168.xxx.xx;专门给组织内部使用的
-
域名:记忆IP问题!
- IP:www.baidu.com
-
四、端口
端口:计算机上一个程序的进程
- 不同的进程有不同的端口号!用来区分软件;
- 端口被规定0~65535
- TCP/UPD分别有65535个端口,单个协议下,端口号不能冲突
- 端口分类:
- 共有端口0~1023
- HTTP协议默认端口:80
- HTTPS协议默认端口:443
- FTP:21
- Telent:23
- 程序注册端口:1024~49151,分配用户或者程序
- Tomcat:8080
- MySQL:3306
- Oracle:1521
- 动态、私有端口:49152~65535
- IDEA:63342
- 共有端口0~1023
netstat -ano # 查看所有端口号
netstat -ano|findstr "5900" # 查看指定的端口
tasklist|findstr "8696" # 查看指定端口的进程
- 谨记两个重要的类:
InetSocketAddress
InetAddress
五、通信协议
协议:约定,就好比中国人得说普通话!
**网络通信协议:**速率、传输码率、代码结构、传输控制…(非常的复杂)
TCP/IP协议簇:是一组协议而并非一个或者两个协议。
- TCP:传输控制协议
- UDP:用户数据报协议
TCP | UDP 对比:
-
TCP:打电话
- 连接,稳定
三次握手 四次挥手
# 最少需要三次,才能保证稳定连接! A:你瞅啥? // 请求连接 B:瞅你咋地? // 请求响应 A:干一场! // 开始通信 # 依依不舍的断开连接 A:我要走了! B:你真的要走了吗? B:你真的真的要走了吗?(再次确认,添狗标配) A:我真的要走了!
- 客户端 服务端
- 传输完成,释放连接,效率低
-
UDP:发短信
- 不连接,不稳定;
- 客户端,服务端;没有明确的界限;
- 不管有没有准备好,都可以发给你…
- 导弹攻击;
- DDOS攻击!(洪水/饱和攻击)
六、TCP
客户端:
1、通过Socket连接服务器;
2、发送消息。
// 1.要知道服务器的地址,端口
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
int port = 9999;
// 2.创建一个socket连接
socket = new Socket(serverIp, port);
// 3.发送消息 IO 流
os = socket.getOutputStream();
os.write("您好,我是java小白冲大厂".getBytes());
服务器:
1、建立服务器ip
和port
;
2、等待客户端的连接,通过accept
进行连接监听;
3、接收消息处理
// 1.我需要一个服务器地址
serverSocket = new ServerSocket(9999);
while (true) {
// 2.等待客户端连接过来
socket = serverSocket.accept();
// 3.读取客户端的消息
is = socket.getInputStream();
// 管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
System.out.println(baos.toString());
}
文件上传
客户端:
// 1.创建一个Socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 2.创建一个输出流
OutputStream os = socket.getOutputStream();
// 3.文件流
FileInputStream fis = new FileInputStream(new File("dog.jpg"));
// 4.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
// 通知服务器,我已经传输完了
socket.shutdownOutput();
// 确定服务器接收完毕,才能够断开连接
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = is.read(buffer2)) != -1) {
baos.write(buffer, 0 ,len2);
}
System.out.println(baos.toString());
// 5.关闭资源
fis.close();
os.close();
socket.close();
服务器:
// 1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
// 2.监听客户端的连接- 阻塞式监听,会一直等待客户端连接
Socket socket = serverSocket.accept();
// 3.获取输入流
InputStream is = socket.getInputStream();
// 4.文件输出
FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
// 通知客户端文件接收完毕了
OutputStream os = socket.getOutputStream();
os.write("我接收完毕了,你可以断开连接了".getBytes());
// 5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
七、UDP
无连接:不需要连接,但是需要知道对方的地址!
发送消息:
发送端:
// 1.建立一个Socket
DatagramSocket socket = new DatagramSocket(8080);
// 2.建个数据包
String msg = "你好啊,服务器!";
// 发送目的地址
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
// 数据,数据的起始位置,终止位置
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
// 3.发送数据包
socket.send(packet);
// 4.关闭流
socket.close();
接收端:
// 1.开放端口
DatagramSocket socket = new DatagramSocket(9090);
// 2.接收数据
byte[] buffer = new byte[1024];
// 接收
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
// 阻塞接收
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(), 0, packet.getLength()));
// 关闭
socket.close();
UDP实现聊天室–单向
UDP实现聊天室-双向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J647B6wT-1640832044205)(D:\APP-文档\学习笔记\java_网络编程.assets\image-20210329093147558.png)]
- 多线程实现通信,十分简单!
八、URL
什么是URL(
**uniform resource locators**
)–>同一资源定位符:https://www.baidu.com
协议://ip地址:端口号/项目名/资源 (五部分最多,可以少但是不能多)
实现聊天室–单向**
UDP实现聊天室-双向
- 多线程实现通信,十分简单!
八、URL
什么是URL(
**uniform resource locators**
)–>同一资源定位符:https://www.baidu.com
协议://ip地址:端口号/项目名/资源 (五部分最多,可以少但是不能多)