课程链接
网络中的包:可以理解为现实中包裹,信封,需要快递员送到我们的手上
丢包:可以理解为包裹在运输途中丢失
单机:无网,没有与其他电脑资源共享
网络编程的目的:无线电台,传播交流信息,数据交换,通信
IP:用来定位另一台主机
端口:用来定位另一台主机上的某一个应用,比如qq,一个端口对应计算机的一个程序进程
协议:主机之间的交流的规则,就像人与人之间的交流,语言就是协议
物理层:比如网线
数据链路层:可能是有线的,也可能是无线的
127.0.0.1:本机localhost,没有网络也能Ping的IP
.com国际域名
.cn国内域名
URL:统一资源定位符,用来定位互联网上的资源
网络上的一切都是流
查找百度的IP地址
ping www.baidu.com
jdk中有InetAddress类
IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议。 IP地址结构由定义RFC 790: Assigned Numbers , RFC 1918: Address Allocation for Private Internets , RFC 2365: Administratively Scoped IP Multicast和RFC 2373: IP Version 6 Addressing Architecture 。 InetAddress的一个实例由一个IP地址和可能的相应主机名组成(取决于它是用主机名构造还是已经完成了反向主机名解析)。
ipconfig查看本地IP
IPV4:127.0.01 ,4个字节组成,0~255,总共42亿;30亿都在北美,亚洲4亿,2011年就已经用尽
IPV6:128位。16个字节,8个无符号整数。2001:acca:0ac1:0002:0ab7:1153:2210:ccc1
通过采用IPV6,我们甚至可以给地球上的每一粒沙子都分配一个IP,IP在地球爆炸之前都用不完
A类网络的IP地址范围为:1.0.0.1-126.255.255.254;
B类网络的IP地址范围为:128.1.0.1-191.255.255.254;
C类网络的IP地址范围为:192.0.1.1-223.255.255.254
可以看到InetAddress这个类没有构造方法,所以无法new,但是我们可以通过静态方法返回本身来拿到这个类,这是一种创建对象的方式
端口对应计算机中一个程序进程,不同的进程有不同的端口!用来区分软件!计算机的端口号限制在0-65535,也就是说电脑最多能跑65535个进程,单个协议下,端口号不能冲突,但是不同的协议可以占用同一个端口号,tcp : 80, udp : 80 这样不影响,所以这样就有65535*2个端口可以用了
查看IDEA端口
新建一个html,然后在浏览器打开,可以看到是63342
netstat -ano #查看所有的端口
netstat -ano|findstr "5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
写一个 TCP
客户端
1.连接服务器Socket
2.发送消息
服务器
1.建立服务的端口ServerSocket
2.等待用户的链接accept
3.接收用户的消息
客户端
//1.要知道服务器的地址,和端口号
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
System.out.println("客户端连接成功");
//2.创建一个 socket 连接
socket = new Socket(serverIP,port);
//3.发送消息 IO 流
os = socket.getOutputStream();
os.write("你好,欢迎学习狂神说Java".getBytes());//注意转换成字节流
服务端
写法1:截取字节的话,对于中文容易乱码,关闭资源时,先打开的资源后关闭
//创建一个接收数据的byte[]数组,及数组的有效长度len
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer))!=-1){//中文容易乱码
String msg = new String(buffer,0,len);
System.out.println(msg);
}*/
如果无法关闭资源,就提升作用域到全局
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
InputStream inputStream = null;
写法2:
写一个UDP
类:DataGramPacket
客户端
public class UdpClientDemo01 {
public static void main(String[] args) throws Exception {
//1.建立一个socket
DatagramSocket socket = new DatagramSocket(8080);
//1.2建立一个能发送的包
//发送的数据,地址
String msg = "你好啊,服务器!";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
//包的内容:数据,数据长度,要发送给谁
DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
//2.发送包
socket.send(packet);
//关闭流
socket.close();
}
}
服务端
public class UdpServerDemo02 {
public static void main(String[] args) throws Exception {
//开放段
//等待客户端的连接
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
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();
}
}
模拟聊天室
可以用cmd运行写好的class文件,然后IDEA再运行一个程序,模拟聊天双方
下载网络资源
举例:下载音乐
/**
* Created by 此生辽阔 on 2021/4/5 21:31
*/
public class urlDownload {
public static void main(String[] args) throws Exception {
//1.下载地址
URL url = new URL("https://m701.music.126.net/20210405215338/89fe7645fc520631222bfa8c732081c4/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/7937683494/31e2/2771/3eef/e1a6f0f79db893a61118d620b204384f.m4a");
//2.连接到这个资源 HTTP
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//3.输入流
InputStream inputStream = urlConnection.getInputStream();
//4.下载到存放地址
FileOutputStream fos = new FileOutputStream("E:/download/f.m4a");
//5.写出数据
byte[] buffer = new byte[1024];
int len ;
while((len = inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.close();
inputStream.close();
urlConnection.disconnect(); //断开连接
}
}