计算机网络
什么是计算机网络
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
计算机网络主要功能
1.实现资源共享
2.信息传输和集中处理
3.均衡负荷以及分布处理
4.综合信息服务 (www/综合业务数字网络 ISDN)
网络通信三要素
1. ip 2.端口号 3.协议
IP地址
域名 = ip+端口号
默认端口号: 80
命令:
ping ip地址或者域名 /查看是否与指定ip连通
ipconfig:查看本机信息,包括自己的ip
ip地址分为: ipv4,ipv6
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
,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题。
IP地址:
网络计算机的唯一标识
计算机底层只能识别二进制数据,所以我们的ip地址应该是一个二进制数据
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
端口号
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
-
端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
利用协议
+IP地址
+端口号
三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
网络默认端口:80
协议
OSI七层模型
传输层协议
UDP
UDP (User Datagram Protocol) : 用户数据报协议,用于传输层,作用: 发送IP 数据包
特点:
无连接,不安全(不可靠), 传输速度快
TCP( 三次握手,四次挥手)
TCP(Transmission Control Protocol): 传输控制协议,用于传输层 , 和IP协议共同使用
特点:
面向连接, 可靠(安全性),字节流,传输较慢
Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口
类型:
流式套接字、数据报套接字和原始套接字
Socket 原理
-
通信的两端都有Socket
-
网络之间的通信就是Socket间的通信
-
数据在两Socket间通过IO传输
UDP协议实现对话
客户端:
package UDP_Thread;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class UDP_client {
public static void main(String[] args) {
// 1.创建一个发送端的套接字
DatagramSocket dsg = null;
try {
dsg = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("你要发送的信息:");
String str = scanner.next();
// 2.创建接收信息的数组
byte[] bytes = new byte[1024];
bytes = str.getBytes();
// 3.设定要上传的服务器地址
InetAddress address=null;
try {
address = InetAddress.getByName("localhost");
} catch (UnknownHostException e) {
e.printStackTrace();
}
// 4.将数据打包上传
DatagramPacket datapa = new DatagramPacket(bytes,0,bytes.length,address,8888);
try {
dsg.send(datapa);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器端:
package UDP_Thread;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
public class UDP_service {
public static void main(String[] args) throws IOException {
// 1.创建一个接收段的套接字
DatagramSocket datasoc =null;//try{}的作用域问题
try {
datasoc = new DatagramSocket(8888);
} catch (SocketException e) {
e.printStackTrace();
}
while (true){
// 2.创建一个接收数据的数组
byte[] bytes = new byte[1024];
// 3.创建数据包获得客户传来的数据
DatagramPacket ds = new DatagramPacket(bytes, bytes.length);
// 4.调用方法接收
try {
datasoc.receive(ds);
} catch (IOException e) {
e.printStackTrace();
}
// 5.获取对方的IP,主机名
InetAddress address = ds.getAddress();
// System.out.println("IP:"+address.getHostAddress());
// System.out.println("主机:"+address.getHostName());
// 6.在服务器输出传入的数据
byte[] data= new byte[1024];
data = ds.getData();
System.out.println(address+" 说: "+new String(data,0, ds.getLength()));
}
}
}
TCP协议实现对话
客户端:
package homework;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TcpClient {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
// 1. 创建Socket( 指定ip ,端口)
Socket socket = new Socket("localhost",8089);
String str;
while (true){
System.out.println("请输入要发送的内容:");
str = scanner.next();
if (str.equals("886")){
socket.close();
break;
}
// (可以向服务写数据)
// 2. 创建输出流对象
OutputStream outputStream = socket.getOutputStream();
// 3. 写入输出的数据
outputStream.write(str.getBytes());
// ( 读取服务端数据 )
// 4. 创建输入流对象
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
// 5. 读取服务器的数据, 打印出来
int len=inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
}
//
// 6. 释放资源
}
}
服务端:
package homework;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class TcpService {
public static void main(String[] args) throws IOException {
// 1. 创建ServerSocket( 指定端口)
ServerSocket serverSocket = new ServerSocket(8089);
// 2. 监听客户端的请求,获取客户端的Socket
Socket socket = serverSocket.accept();
while (true){
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];//接收字节
int len = inputStream.read(bytes);//读取长度
//获得ip地址
InetAddress inetAddress = socket.getInetAddress();
// 4. 读取客户端的数据, 打印出来
System.out.println(inetAddress+":"+ new String(bytes,0,len));
// (可以向客户端写数据)
// 5. 创建输出流对象
OutputStream outputStream = socket.getOutputStream();
// 6. 写入输出的数据
outputStream.write("服务器收到".getBytes());
}
// ( 读取客户端数据 )
// 3. 创建输入流对象
// 7. 释放资源
}
}