前言
本文介绍最初的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
3. 输入 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 的发送端和接收端就可以实现了
还有进阶的,是放在练习里,在不久之后会更新