网络的定义
-
我们将多台计算机按照一定的模式连接到一起的一种方式
-
同一个网络中的计算机可以相互进行访问
主要功能
-
资源共享
-
-
均衡负荷与分布处理
网络分层
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成 一些简单的成份, 再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调 用下一层,而与再下一层不发生关系。
通信协议的分层
物数网传会表应
-
物理层
-
数据链路层
-
网络层
-
传输层
-
会话层
-
表示层
-
应用层
物理层
-
网络硬件人员需要具备的条件
-
作为Java程序员了解即可?除非你给妹子接网线
网络层
-
我们网络中有可能有很多的机器,如何唯一性的定位到你
-
定位网络中的一台机器
-
IP
-
Internet protocol网络协议
-
IP分为IP4和IP6
-
最初的是IP4占用4个字节,一个字节是[0-255].于是IP4的取值为
-
一个企业也只占用几个公网IP
-
因为IP4不够用了,于是诞生了IP6 ,IP6占用16个字节
-
但是现在正处于ip4到ip6的转换过程中,需要一定的时间
-
-
port
-
因为一台服务器只有一个IP,所以导致当别人访问这台服务器的时候
-
我们还需要区分是访问的那个应用
-
端口占用2个字节,范围是[0-65535] ,我们可以把一个应用绑定在一个端口上
-
当别人访问这个端口的时候,就可以直接访问这个应用
-
不要使用1024之下的端口,系统保留端口
-
-
IP是为了定位一台电脑,端口是为了定位一个应用
-
DNS
-
域名系统(服务)协议
-
是为了更好的记忆IP地址
-
域名解析服务器:可以将域名解析成IP地址,以前有很多病毒专门做Hosts欺骗
-
-
InetAddress
-
获取指定的IP地址,只通过IP定位到某一个主机
-
public class NetDemo01 {
public static void main(String[] args) throws UnknownHostException {
//static InetAddress getLocalHost() 返回本地主机的地址。
InetAddress i1 = InetAddress.getLocalHost();
System.out.println(i1); //DESKTOP-P04TCL5/192.168.14.111
//static InetAddress getByName(String host) 决定了IP地址的主机,主机的名字。
InetAddress i2 = InetAddress.getByName("www.baidu.com");
System.out.println(i2); //www.baidu.com/180.101.49.12
System.out.println(i1.getHostName()); //DESKTOP-P04TCL5
System.out.println(i1.getHostAddress()); //192.168.14.111
-
InetSocketAddress
-
不但可以获取IP地址,还可以使用端口进行定位
-
可以直接定位到某一个应用
-
-
URL--URI
-
统一资源定位符
-
http://tool.cncn.com/youbian/100086
-
http:// 传输协议
-
tool.cncn.com IP地址 :80 默认网络传输的端口号为80
-
/youbian/100086 资源位置
-
-
https://www.ip138.com/post/search.asp?area=100086&action=area2zone
-
https:// 传输协议
-
www.ip138.com DNS -->IP地址 104.24.98.161 :80 端口号
-
search.asp 资源位置
-
?area=100086&action=area2zone 请求的参数
-
-
这个资源的定位是全网统一的,每一个资源在网络上都有一个唯一的定位
-
public class URLDemo03 {
public static void main(String[] args) throws MalformedURLException {
//URL(String spec)
URL url = new URL("http://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");
System.out.println(url);
//getProtocol() 协议
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile()); ///index.html?name=zhangsan&pwd=123
System.out.println("文件:"+url.getPath());
System.out.println("数据:"+url.getQuery());
System.out.println("锚点:"+url.getRef());
-
传输层
-
TCP
-
传输控制协议
-
包含: http https ftp smtp
-
数据相对安全的一种协议,基于连接的,如果使用tcp协议传输数据,必须先建立连接,然后发送数据
-
TCP相当于打电话
-
三次握手,四次挥手
-
建立连接时
-
1客户端发送一个连接请求到服务器
-
2服务器检查自己并返回一条响应信息
-
3客户端发送消息确认建立连接
-
-
断开连接时
-
1客户端发送请求说要断开连接
-
2服务器开始受到请求,检查是否有未传输的数据
-
3服务器检查完毕,确认断开
-
4客户端也确认断开连接
-
-
-
安全,但是效率有点低,后面专门做了一些优化措施
-
-
UDP
-
用户数据包
-
基于数据包发送的协议,我们的目的就是发送出去数据包
-
UDP相当于发短信
-
相对效率较高,但是不安全
-
应用层
-
对应的程序使用到网络传输的数据
Socket编程
UDP
UDP实现基本流程: 发送端
-
1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
-
2.准备数据--> 转为字节数组
-
3.打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。
-
4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。
-
5.关闭
public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是发送端------------------");
//1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
DatagramSocket send = new DatagramSocket(7777);
//2.数据
byte[] msg = "Hello".getBytes();
//3.打包
DatagramPacket packet = new DatagramPacket(msg,0,msg.length,new InetSocketAddress("localhost", 8888));
//4.发送
send.send(packet);
//5.关闭
send.close();
}
}
UDP实现基本流程: 接收端
-
1.构建接收端
-
2.准备包裹-->用来接收数据
-
3.接收
-
4.处理数据
-
5.关闭
public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是接收端-----------");
//1.构建接收端
DatagramSocket receive = new DatagramSocket(8888);
//2.准备包裹-->用来接收数据
byte[] arr = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
//3.接收
receive.receive(packet);
//4.处理数据
/*
* byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
*/
byte[] result = packet.getData();
int length = packet.getLength();
System.out.println(new String(result,0,length));
//5.关闭
receive.close();
}
}
TCP
tcp基于IO流操作
-
TCP 基本流程: 客户端
-
1.创建客户端 Socket(String host, int port) 指定服务端的IP+端口
-
2.获取IO流
-
3.写出数据
-
4.关闭
public class TCPClient03 {
public static void main(String[] args) throws UnknownHostException, IOException {
String name = "aaa";
String pwd = "123";
System.out.println("---------------client--------------");
//1.创建客户端
Socket client = new Socket("127.0.0.1",8888);
//2.获取输入流
OutputStream os = client.getOutputStream();
//3.写出数据
os.write(("name="+name+"&pwd="+pwd).getBytes());
os.flush();
//获取输入流读取服务端响应
InputStream is = client.getInputStream();
byte[] car = new byte[1024];
int len = is.read(car);
System.out.println(new String(car,0,len));
//4.关闭
is.close();
os.close();
client.close();
}
}
tcp基于IO流操作
-
TCP 基本流程: 服务端
-
1.创建服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 服务端的端口号
-
2.阻塞式监听
-
3.获取IO流
-
4.读入数据
-
5.操作数据
-
6.关闭
public class TCPServer04 {
public static void main(String[] args) throws IOException {
System.out.println("---------------Server--------------");
//1.创建服务端
ServerSocket server = new ServerSocket(8888);
//2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------有一个客户端连接成功----------");
//3.获取IO流
InputStream is = client.getInputStream();
//4.读入数据
byte[] car = new byte[1024];
//把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
int len = is.read(car);
String name =null;
String pwd =null;
//5.操作数据
String str = new String(car,0,len);
//分割数据 name=aaa&pwd=123
String[] arr = str.split("&");
for(String s:arr) {
String[] ss = s.split("=");
//判断当前这个ss[1]是名字的值还是密码的值
if("name".equals(ss[0])) {
name = ss[1];
}else {
pwd = ss[1];
}
}
System.out.println(name);
System.out.println(pwd);
//获取输出流
OutputStream os = client.getOutputStream();
//校验
if("111".equals(