目录

Java网络编程初阶

Java网络编程初阶


前言

本文介绍最初的java网络编程

在后面会更新练习的内容,在练习的内容来更深入理解网络编程

🏠我的主页:

📚系列专栏:

一、 初始网络编程

网络编程顾名思义,就是在网络中的 发送端接收端 进行通信

用到网络就先了解一下网络

二、 相关网络知识介绍

这里我会介绍,网络编程 会用到的 网络相关知识,更全面次的网络知识,后期会发布的😊

1. 网络三要素

1.1. IP

IP就是在广域网中 唯一标识 ( 是的,在广域网中可以通过IP知道用的是什么设备 )

在网络中,分为

  1. 局域网
  2. 城域网
  3. 广域网

所以这里强调的是在广域网中的唯一标识

1.1.1. IPv4

特点:点分十进制

例如: 192.168.1.1

特殊IP:127.0.0.1(表示本机IP)

可以通过以下步骤查到本机ip

  1. win + r
  2. 输入cmd

https://i-blog.csdnimg.cn/direct/d66eb2229548492c8eb062276ce00db4.png

  1. 输入 ipconfig

https://i-blog.csdnimg.cn/direct/e45208ea9d12439f9415e53110593638.png

https://i-blog.csdnimg.cn/direct/bca7fa8d7456407eb0db56f26cf5f728.png

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. 发送端

步骤

  1. 创建 **DatagramSocket

    绑定端口

    绑定端口,就是从这个端口发送数据

    没有端口,就是从任意端口发出

    因为是发出的数据,所以不用写**

  2. 打包数据

    DatagramPacket

  3. 发送数据

  4. 释放资源

DatagramPacket包含的4个内容

https://i-blog.csdnimg.cn/direct/01e26f52019142f8bba7d6488c92528c.png

//发送数据
//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. 接收端

步骤

  1. 创建 DatagramSocket

    **这里要指定接收的端口

    绑定的端口一定要跟发送的端口保持一致**

  2. 接收数据包

  3. 解析数据包

  4. 释放资源

https://i-blog.csdnimg.cn/direct/0868c0ad724a4d209d54170848739446.png

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. 客户端

步骤

  1. 建立IP和端口的连接

    这里要提供服务端的IP和端口

  2. 获取输出流

    要通过 创建的socket的对象

    内部的getOutputStream()输出流函数

    通过write写数据

  3. 关闭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. 服务端

步骤

  1. 创建ServerSocket对象
  2. 同意接受 ,监听客户端的连接
  3. 从连接同道中获取输入流读取对象
  4. 释放
//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()));

总结

https://i-blog.csdnimg.cn/direct/5d8e7b175c0a4be5a7eb005f5e31d1f4.png

到现在为止,简单的TCP 和 UDP 的发送端和接收端就可以实现了

还有进阶的,是放在练习里,在不久之后会更新