1.1概述
计算机网络: 将地理位置不同的具有独立功能的多台计算机和其他外部设备通过网络连接起来实现资源共享和信息传递。
网络编程的目的: 传播交流信息,数据交换,通信。
怎么实现网络通信: 先找到相应的端口定位到这个计算机上的某个资源。
1.2网络通信的要素
- IP和端口号
- 网络通信协议
1.3IP
ip地址:InetAddress
-
唯一定位一台网络上计算机
-
127.0.0.1:本机地址(localhost)
-
ip地址分类:
-
ipv4/ipv6
- IPV4 : 127.0.0.1,四个字节组成,每一位都是0-255,最大可以分配42亿个;30亿在北美,亚洲4亿。2011年用尽。
- IPV6 : fe80::b384:b971:9755:b517%9,128位,8个无符号整数表示,两个::之间省略了多组0000
-
公网 (互联网)- 私网(局域网)
- ABCD类网
- A:0.0.0.0 - 127.0.0.0 - B:128.0.0.0 - 191.255.255.255 - C:192.0.0.0 - 223.255.255.255 - D:224.0.0.0 - 239.255.255.255 - E:240.0.0.0 - 255.255.255.254- 192.168.xx.xx 专门给组织内部使用
-
-
域名:记忆IP问题
1.4端口
端口表示一个程序的进程:
-
不同的进程有不同的端口号(0 ~ 65535),用来区分软件。
-
TCP, UDP : 65535 * 2 单个协议下端口号不能冲突,多个协议可以,例如 TCP可以用80端口的同时UDP也可以使用。
-
端口的分类
-
共有端口 0~1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23
-
程序注册端口:1024~49151,分配用户或程序
- Tomcat:8080
- MySQL:3306
- Oracle:1521
- Redis:6379
-
动态、私有:49152~65535
netstat -ano # 查看所有的端口 netstat -ano|findstr "5900" # 查看指定的端口 tasklist|findstr "8696" # 查看指定端口的进程 Ctrl + shift + Esc # 开启任务管理器
-
1.5通信协议
协议:为了让不同设备之间的数据进行交互而预先定义的一套规则、标准。
TCP/IP协议簇:本质上是一组协议
重要:
- TCP:是一种面向连接的,可靠的流式传输协议
- UDP:无连接的传输层协议,用于在网络中传输数据报,高效不可靠。
TCP UDP比较:
TCP:打电话
-
需要进行三次握手 四次挥手,稳定可靠
三次连接: a往b发送syn为了确认a的通信状态 b回给a ack表明a的通信没问题,并发给a syn确认自己的通信状态 a发给b ack告诉b b的通信没问题 接下来可以进行通信了 四次挥手: a往b发送 fin表明自己想要断开连接了 b发送给a ack表明a的信息都发完了可以单方面断开连接了(a不再发送信息但能接收b的信息) b发送给a fin表明b想要跟a断开连接了 a发送给b ack表明b的信息都发完了可以完全断开a和b之间的连接了 -
一对一两点服务,客户端和服务端
-
能进行拥塞控制和流量控制
-
是流式传输,数据没边界,保证顺序
UDP:发短信
- 不连接,不稳定,不可靠,消息会丢失
- 可以一对一,一对多,多对多
- 不能进行两个控制
- 发的是数据包有边界,但会造成丢包和乱序
- DDOS:洪泛攻击!一直发送请求导致相应的信息通道被垃圾数据包阻塞。
1.6TCP
客户端
1.连接服务器Socket
2.发送消息
服务端
1.建立服务的端口ServerSocket
2.等待用户的连接 accept
3.接收用户的消息
文件上传
1.7UDP
发送消息
发送端
public class UdpClientDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String msg = "你好服务器";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
socket.send(packet);
socket.close();
}
}
接收端
public class UdpServerDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
socket.receive(packet);
socket.close();
}
}
咨询
发送端
public class UdpSendDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
BufferedReader bufRed = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data = bufRed.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
socket.send(packet);
if (data.equals("bye")){
break;
}
}
socket.close();
}
}
服务端
public class UdpReceiveDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);
while(true){
byte[] contains = new byte[1024];
DatagramPacket packet = new DatagramPacket(contains, 0, contains.length);
socket.receive(packet);
byte[] data = packet.getData();
String s = new String(data, 0, packet.getLength());
System.out.println(s);
if (s.equals("bye")){
break;
}
}
socket.close();
}
}
在线咨询
用循环来进行持续的对话
1.8URL
统一资源定位符:定位到互联网上的某一个资源。
DNS域名解析:将www.baidu.com (协议+域名) 解析成 http://153.3.238.127 (协议+ip)
协议://ip地址/域名 /端口号 /路径 /访问参数 /片段