计算机网络
一、什么是计算机网络
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
二、计算机网络主要功能
-
资源共享
-
信息传输与集中处理
-
均衡负荷与分布处理
-
综合信息服务 (www/综合业务数字网络 ISDN)
三、网络通过的三要素
-
ip地址
-
端口号
-
协议
1、IP地址
网络计算机的唯一标识
计算机底层只能识别二进制数据,所以我们的ip地址应该是一个二进制数据
-
域名 = ip + 端口
-
默认端口: 80
-
两个命令:
**
ping ip
**地址/域名 //查看是否与指定的ip 连接通ipconfig
: 查看本机的网络信息,包括有自己ip地址 -
ip地址两类:
- IPv4: 是一个32位的二进制数,通常被分为4个字节,表示成
a.b.c.d
的形式,例如192.168.65.100
。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。 - **IPv6:**由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。
为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。 - IPv4: 是一个32位的二进制数,通常被分为4个字节,表示成
-
IP地址的组成 :
网络号段 + 主机号段
-
IP地址分类:
IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。 全0和全1的都保留不用。
A类:(1.0.0.0-126.0.0.0) (默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节 为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个 字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1] 。
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。
私有地址(不再互联网上使用,而是局域中使用):
-
10.x.x.x
-
192.168.x.x
-
172.16.0.0 - 172.31.255.255
2、端口号
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
- **端口号:用两个字节表示的整数,它的取值范围是065535**。其中,01023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
利用协议
+IP地址
+端口号
三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
网络默认端口:80
3、协议
OSI七层模型
传输层协议
-
UDP
UDP (User Datagram Protocol) : 用户数据报协议,用于传输层,作用: 发送IP 数据包
特点:
无连接,不安全(不可靠), 传输速度快
-
TCP( 三次握手,四次挥手)
TCP(Transmission Control Protocol): 传输控制协议,用于传输层 , 和IP协议共同使用
特点:
面向连接, 可靠(安全性),字节流,传输较慢
-
术语:
ACK : 确认位
-
ACK = 1: 确认有效
-
ACK=0 : 确认无效
SYN: 同步位 SYN = 1 表示进行连接请求
FIN: FIN = 1 表示断开连接
ack : 确认号, 值 为:对方发送的序列号+1
seq: 序列号
-
四、Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口
类型:
流式套接字、数据报套接字和原始套接字
Socket 原理
-
通信的两端都有Socket
-
网络之间的通信就是Socket间的通信
-
数据在两Socket间通过IO传输
五、UDP编程
InetAddress : java中提供的一个类,此类表示Internet协议(IP)地址。
键盘录入数据(可以替换Scanner): BufferedReader br = new BufferedReader (new InputstreamReader(system.in) );
udp发送
public class UDPSend {
public static void main(String[] args) throws IOException {
/*
* UDP发送数据
* 1.创建发送端的Socket
* 2.创建数据,打包成数据报
* 3.调用Socket中的发送方法
* 4.释放资源
*
*/
//1.创建发送端的Socket DatagramSocket(数据报套接字)
DatagramSocket dgs = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true){
// 组包(数据报包)
System.out.println("请输入你要发送的数据");
String str = sc.next();
if(str.equals("886")){
dgs.close();
break;
}
byte[] buf = str.getBytes();
InetAddress address = InetAddress.getByName("localhost");
// 本机 localhost 127.0.0.1
//2.2.创建数据,打包成数据报
DatagramPacket dp = new DatagramPacket(buf,0,buf.length, address,8888);
//3.调用Socket中的发送方法
dgs.send(dp);
}
//4.释放资源
// dgs.close();
}
}
udp接收
public class UDPRecive {
public static void main(String[] args) throws IOException {
/*
* UDP接收数据
1.创建接收端的socket
2.创建─个数据报包(接收容器)
* 3.调用socket接收方法
4.解析数据,打印出来
* 5.释放资源
* */
//1.创建接收端的socket
DatagramSocket dgs = new DatagramSocket(8888);
//2. 创建─个数据报包(接收容器)
byte[] bytes = new byte[1024];
while(true){
DatagramPacket ds = new DatagramPacket(bytes,bytes.length);
//3.调用socket接收方法
dgs.receive(ds);
//4.解析数据,打印出来
// 解析发送过来的Ip地址
InetAddress address = ds.getAddress();
System.out.println("ip地址"+address.getHostAddress());
System.out.println("主机名"+address.getHostName());
//传的byte数据
byte[] data = ds.getData();
System.out.println(new String(data,0,ds.getLength()));
}
//释放资源
//dgs.close();
}
}
六、TCP编程
七、上传视频
客户端
package com.gxa.tcp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
//上传文件的客户端
public class UploadClient {
public static void main(String[] args) throws Exception, IOException {
//1.创建Socket对象
Socket socket=new Socket("127.0.0.1", 8080);
//2.从磁盘读取数据到内存 in
//BufferedInputStream(InputStream in) 字节输入缓冲流
BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\gxa\\Desktop\\001.jpg"));
//3.往服务器写出数据
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
//4.流的模板代码
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush(); //可能丢包
}
//5.传输文件,传输完毕,关闭输出流
socket.shutdownOutput();
//6.获取服务器反馈
InputStream ii = socket.getInputStream();
byte[] bys=new byte[1024];
int l=ii.read(bys);
System.out.println(new String(bys, 0, l));
in.close();
socket.close();
}
}
服务端:
package com.gxa.tcp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) throws Exception {
//1.创建ServerSocket对象
ServerSocket serverSocket=new ServerSocket(8080);
//2.获取到客户端Socket对象
Socket socket = serverSocket.accept();
//3.读取客户端的数据
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
//4.往服务器磁盘写出数据
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("001.jpg"));
//5.流的模板代码
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush();
}
//5.反馈服务器端已经上传成功!
socket.getOutputStream().write("文件上传成功!".getBytes());
out.close();
socket.close();
serverSocket.close();
}
}
ileOutputStream(“001.jpg”));
//5.流的模板代码
byte[] buffer=new byte[1024];
int len=0;
while((len=in.read(buffer))>0) {
out.write(buffer,0,len);
out.flush();
}
//5.反馈服务器端已经上传成功!
socket.getOutputStream().write("文件上传成功!".getBytes());
out.close();
socket.close();
serverSocket.close();
}
}