在通信协议下,不同计算机上运行的程序,进行数据传输。
- C/S:在用户本地需要下载并安装客户端程序,在远程有一个服务端程序;
- B/S:需要浏览器,通过不同的网址访问不同的服务器。
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传输控制协议:面向连接的协议,速度慢,没有大小限制,数据安全。
// 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"));
- 通信之前保证连接已经建立;
- 通过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();