Skip to content

Latest commit

 

History

History
161 lines (113 loc) · 3.53 KB

File metadata and controls

161 lines (113 loc) · 3.53 KB

NET

基础

在通信协议下,不同计算机上运行的程序,进行数据传输。

常见软件架构

  1. C/S:在用户本地需要下载并安装客户端程序,在远程有一个服务端程序;
  2. B/S:需要浏览器,通过不同的网址访问不同的服务器。

网络编程三要素

IP

IP:设备在网络中的地址,是唯一标识。

  • IPv4:采用32位地址长度,分成四组通过点分十进制表示。
    • 127.0.0.1:本地回环
    • 255.255.255:广播地址
    • 224.0.0.0~239.255.255.255:组播地址
  • IPv6:采用128位地址长度,分成八组通过冒分十六进制表示。
ipconfig // 查看本机IP
ping     // 检查网络是否连通

InetAddress(Inet4Address,Inet6Address)

// 获取InetAddress对象
InetAddress address = InetAddress.getByName("192.168.1.100"); // 计算机名或IP地址

address.getHostName();     // 获取主机名
address.getHostAddress();  // 获取主机地址

端口号

端口号:应用程序在设备中的唯一标识。

  • 两个字节表示的整数,0-65535。
  • 0-1023之间的端口号用于一些知名的网络服务和应用,自己使用1024以上的端口号。
  • 一个应用使用一个端口号。

协议

协议:数据在网络中传输的规则。

TCP/IP模型

  • 应用层:HTTP、FTP、DNS
  • 传输层:TCP、UDP
  • 网络层:IP、ICMP、ARP
  • 物理链路层

UDP用户数据报协议:面向无连接的通信协议,速度快,有大小限制依次最多发64K,数据不安全,容易丢失数据。 TCP传输控制协议:面向连接的协议,速度慢,没有大小限制,数据安全。

UDP协议

发送数据

单播

// 1. 创建DatagramSocket对象
// 参数是端口号,不填为随机
DatagramSocket ds = new DatagramSocket();

// 2. 打包数据
String str = "hello";
byte[] bytes = str.getBytes();
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

// 3. 发送数据
ds.send(dp);
ds.close();

组播

// 创建MultiSocket对象
// 参数是端口号,不填为随机
DatagramSocket ds = new DatagramSocket();

接收数据

单播

// 1. 创建DatagramSocket对象
// 一定要绑定端口,且与发送数据的端口相同
DatagramSocket ds = new DatagramSocket(10086);

// 2. 接受数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp); // 该方法是阻塞的

// 3. 解析数据包
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress addr = dp.getAddress();
int port = dp.getPort();

ds.close();

组播

// 将本机添加到224.0.0.1的组中
ms.joinGroup(InetAddress.getByName("224.0.0.1"));

TCP协议

  1. 通信之前保证连接已经建立;
  2. 通过Socket产生IO流来进行网络通信。

客户端

// 1. 创建socket对象同时连接服务端
Socket socket = new Socket("127.0.0.1", 10000);

// 2. 从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
os.write("你好".getBytes());

// 3. 释放资源
os.close();
socket.close();

服务器

// 1. 创建socketServer
SocketServer ss = new SocketServer(10000);

// 2. 监听客户端的连接
Socket socket = ss.accept();

// 3. 从连接中获取输入流读取数据
InputStream is = socket.getInputStream();
int b = is.read(); // 按字节读

// 字节流->字符流
InputStreamReader isr = new InputStreamReader(is);

// 4. 释放资源
socket.close();
ss.close();