Java网络编程初阶
Java网络编程初阶
前言
本文介绍最初的java网络编程
在后面会更新练习的内容,在练习的内容来更深入理解网络编程
🏠我的主页:
📚系列专栏:
一、 初始网络编程
网络编程顾名思义,就是在网络中的 发送端 和 接收端 进行通信
用到网络就先了解一下网络
二、 相关网络知识介绍
这里我会介绍,网络编程 会用到的 网络相关知识,更全面次的网络知识,后期会发布的😊
1. 网络三要素
1.1. IP
IP就是在广域网中 唯一标识 ( 是的,在广域网中可以通过IP知道用的是什么设备 )
在网络中,分为
- 局域网
- 城域网
- 广域网
所以这里强调的是在广域网中的唯一标识
1.1.1. IPv4
特点:点分十进制
例如: 192.168.1.1
特殊IP:127.0.0.1(表示本机IP)
可以通过以下步骤查到本机ip
- win + r
- 输入cmd
- 输入 ipconfig
IPv4一共有4^32个,现在是已经用完了,但是我们在网络通信中,基本上还是用的IPv4
1.1.2. IPv6
因为IPv4用完了,现在很多地方都用了IPV6,之后也会变普遍的
特点:冒分十六进制
例如: 00-01-00-11-2E-83-2E-0E-28-C5-F8-3D-49-47
有2^128个
1.2. 端口号
端口号: 应用程序 在 设备 中的 唯一标识
这就和IP对应上了,可以这样理解
- IP 这台设备
- 端口号 就是这台设备上的某个应用程序
端口号的取值范围:0 ~ 65535
其中,0 ~ 1023 之间的端口号用于一些知名的网络服务或应用
我们使用 1024以上的端口号即可
1.3. 协议
协议:通信双方必须遵守的约定(规则)
因为本次网络编程只会涉及两个协议:TCP、UDP
1.2.1. TCP
TCP(传输控制协议)
是 面向连接 的
特点:速度慢,没有大小限制,数据是安全的
需要通信双方确立连接
应用:下载软件,发送邮件(因为这些不能让数据丢失)
1.2.2. UDP
UDP(用户数据报协议)
是面向无连接的
特点:一次最多发送64KB,数据不安全,易丢失
应用:打视频电话(反正就是卡一下而已)
UDP是只管发,不管你有没有接收到
接下来,就围绕网络三要素以及两个网络协议来分别讲解,网路编程的实现
三、网络编程的实现
1. UDP的网络编程实现
1.1. 发送端
步骤
创建 **DatagramSocket
绑定端口
绑定端口,就是从这个端口发送数据
没有端口,就是从任意端口发出
因为是发出的数据,所以不用写**
打包数据
DatagramPacket
发送数据
释放资源
DatagramPacket包含的4个内容
//发送数据
//1. 创建DatagramSocket对象
DatagramSocket host;
try {
// 绑定端口,就是从这个端口发送数据
// 没有端口,就是从任意端口发出
host = new DatagramSocket();
} catch (SocketException e) {
throw new RuntimeException(e);
}
//2. 打包数据
String str = "欢迎来到艺杯羹的博客!";
// 转成字节数组
byte[] bytestr = str.getBytes();
//获取ip(电脑)对象地址
InetAddress address = InetAddress.getByName("192.168.1.50");
// 发送的端口号
int post = 8888;
// 打包数据中包含以下四个内容
// 1. 打包的字节数据
// 2. 打包的个数
// 3. 打包的地址
// 4. 打包的端口
DatagramPacket packet = new DatagramPacket(bytestr, bytestr.length, address, post);
//3. 发送数据
try {
host.send(packet);
} catch (IOException e) {
throw new RuntimeException(e);
}
//4.释放资源
host.close();
}
1.2. 接收端
步骤
创建 DatagramSocket
**这里要指定接收的端口
绑定的端口一定要跟发送的端口保持一致**
接收数据包
解析数据包
释放资源
public static void main(String[] args) throws SocketException {
// 创建Datagramsocket对象
// 注意:
//在接收的时候,一定要绑定端口
//而且绑定的端口一定要跟发送的端口保持一致
DatagramSocket receive = new DatagramSocket(8080);
// 2.接收数据包
// 因为是字节,所以就先弄一个字节数组来接收数据
byte[] str = new byte[1024];
// 创建接收的DatagramPacket包
// 空号里的两个值是
// 1. 存放到哪个字节数组
// 2. 存放的长度
DatagramPacket data = new DatagramPacket(str, str.length);
try {
// 接收数据
receive.receive(data);
} catch (IOException e) {
throw new RuntimeException(e);
}
// 3. 解析数据包
// getData()返回发送来的数据
byte[] data1 = data.getData();
// 返回发送端的端口号
int port = data.getPort();
// 返回发送端的地址
InetAddress address = data.getAddress();
// 返回数据的长度
int len = data.getLength();
System.out.println("地址和端口为:" + address + " " + port);
System.out.println("接收的数据为" + new String(data1, 0, len) +" " + "长度为:" + len);
// 4. 释放资源
receive.close();
}
先自己实现一遍这个代码,再往后看😊
2. TCP的网络编程实现
TCP通信协议是一种 可靠 的网络协议,它在通信的两端各建立一个Socket对象
在开始通信之前,要保证连接已经建立
通过Socket产生的IO流来进行网络通信
1.1. 客户端
步骤
建立IP和端口的连接
这里要提供服务端的IP和端口
获取输出流
要通过 创建的socket的对象
内部的getOutputStream()输出流函数
通过write写数据
关闭socket
// 1.建立IP和端口的连接
Socket socket = new Socket("127.0.0.1", 8080);
//2.获取输出流
OutputStream out = socket.getOutputStream();
//写数据
out.write("Hillo!!!".getBytes());
//3.关闭
out.close();
1.2. 服务端
步骤
- 创建ServerSocket对象
- 同意接受 ,监听客户端的连接
- 从连接同道中获取输入流读取对象
- 释放
//1.创建ServerSocket对象
ServerSocket server = new ServerSocket(8080);
//2.同意接受 ,监听客户端的连接
Socket socket = server.accept();
//3.从连接通道中获取输入流读取对象
InputStream input = socket.getInputStream();
int b;
while((b = input.read()) != -1){
System.out.print((char)b);
}
//4.释放
socket.close();
server.close();
1.2.1. 乱码问题
这是最简洁的代码,如果是中文,可能会出现乱码
那么,现在来改进一下代码
在第三步的位置,把接受的代码改成
InputStream input = socket.getInputStream();
InputStreamReader ins = new InputStreamReader(input);
BufferedReader buffer = new BufferedReader(ins);
// 写成一行
BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
总结
到现在为止,简单的TCP 和 UDP 的发送端和接收端就可以实现了
还有进阶的,是放在练习里,在不久之后会更新