当前位置: 首页 > news >正文

Java网络编程初阶

目录

一、 初始网络编程

二、 相关网络知识介绍

1. 网络三要素

1.1. IP

1.1.1. IPv4

1.1.2. IPv6

1.2. 端口号

1.3. 协议

1.2.1. TCP

1.2.2. UDP

三、网络编程的实现

1. UDP的网络编程实现

1.1. 发送端

1.2. 接收端

2. TCP的网络编程实现

1.1. 客户端

1.2. 服务端

1.2.1. 乱码问题

总结


前言

本文介绍最初的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

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

步骤

  1. 创建 DatagramSocket
    绑定端口
    绑定端口,就是从这个端口发送数据
    没有端口,就是从任意端口发出
    因为是发出的数据,所以不用写
  2. 打包数据 
    DatagramPacket
  3. 发送数据
  4. 释放资源

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. 接收端

步骤

  1. 创建 DatagramSocket 
    这里要指定接收的端口
    绑定的端口一定要跟发送的端口保持一致
  2. 接收数据包
  3. 解析数据包
  4. 释放资源

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()));

总结

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

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

相关文章:

  • 解决jsch远程sftp连接报错:Exception:Algorithm negotiation fail
  • 通过 ElasticSearch的Python API和`curl` 命令获取Elasticsearch 所有索引名称
  • 大模型开源的工具包有哪些特殊符号可以使用;SEP 是什么
  • GitLab的Dockerfile 追踪
  • linunx ubuntu24.04.02装libfuse2导致无法开机进不了桌面解决办法
  • 版本控制器Git(1)
  • 虚幻C++插件胚胎级入门 | Slate Widget开发
  • Excel多级联动下拉菜单设置
  • YOLOv12:以注意力为中心的实时目标检测器
  • mac部署GPT-SoVITS,生成粤语踩坑点及使用记录
  • Spring框架中的单例Bean是线程安全的吗
  • 《Android应用性能优化全解析:常见问题与解决方案》
  • 自动化领域零部件企业研究
  • windows上传uniapp打包的ipa文件到app store构建版本
  • OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改
  • 小肥柴慢慢手写数据结构(C篇)(4-3 关于栈和队列的讨论)
  • CentOS 8 更换软件源
  • Ubuntu 22.04 无法进入图形界面的解决方法
  • 浅谈大语言模型(LLM)的微调与部署
  • centos 安装 php gmp 模块
  • 考试网站建设/品牌公关
  • 以中文做域名的网站/网络优化工作应该怎么做
  • 最新手游2022首发排行/seo搜索优化
  • wordpress 登录模块/工具站seo
  • 你愿不愿意做我女朋友网站/深圳网络推广收费标准
  • 网站怎么做背景不变页面滑动/建设优化网站