第七章 - Java网络编程(三)

系列文章目录

Java基础篇之jdk、jre环境变量的配置
第一章 - Java基本语法
第六章 - Java集合
第七章 - Java网络编程(一)
第七章 - Java网络编程(二)



前言

本章节继续介绍TCP协议连接时的一些细节,另外还有使用DDP协议实现数据在发送端和接收端的数据传输,以及几个小案例


一、TCP连接秘密

1.客户端也有一个端口与服务端交互

从之前介绍的章节来看我们都知道,使用TCP协议传输数据时,都有一个客户端和服务端的概念,并且提到服务端需要在某个IP的某个端口进行监听,等待客户端的连接,那么在客户端和服务端进行通讯的时候,客户端其实也是有一个端口的与服务端进行交互的,这个端口是TCP/IP来分配的,是不确定的,是随机的。

2.图解

在这里插入图片描述

二、UDP原理

1.UDP基本介绍

  • 类DatagramSocket和DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。
  • UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  • DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
  • UDP协议中每个数据报都给出了完整地址信息,因此无需建立发送方和接收方的连接。

2.基本流程

  • 核心的两个类/对象 DatagramSocket与DatagramPacket
  • 建立发送端,接收端
  • 建立数据包
  • 调用DatagramSocket的发送、接收方法
  • 关闭DatagramSocket

3.UDP网络编程原理示意图

在这里插入图片描述

4.UDP网络编程案例

要求:

  • 编写一个接收端A,和一个发送端B
  • 接收端A在9999端口等待接收数据(receive)
  • 发送端B向接收端A发送数据“hello, 明天吃火锅~”
  • 接收端B接收到发送端A发送的数据,回复“好的,明天见”,再退出
  • 发送端接收回复的数据,再退出

图解:
在这里插入图片描述
接收端代码实现-UDPReceiveA:


```java
package com.cuinn.udp;

import java.io.IOException;
import java.net.*;

/**
 * @author ckwu
 * @version 1.0
 * @project JavaProject
 * @description 接收端A
 * @date 2022-10-06 12:58:54
 */
public class UDPReceiveA {
    public static void main(String[] args) throws IOException {
        // 1.创建一个DatagramSocket对象,准备在9999接收数据
        DatagramSocket socket = new DatagramSocket(9999);
        // 2.构建一个DatagramPacket对象,准备接收数据
        // UDP协议数据包最大64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        // 3.调用接收方法, 将通过网络传的DatagramPacket对象填充到packet对象
        // 提示:当有数据包发送到本机的9999端口时,就会接收到数据,如果没有数据报发送到本机的9999端口,就会阻塞等待。
        System.out.println("接收端A 等待接收数据..。");
        socket.receive(packet);
        // 4.可以把packet进行拆包,取出数据,并显示。
        int length = packet.getLength();// 世界接收的数据字节长度
        byte[] data = packet.getData();// 接收到的数据
        String s = new String(data, 0, length);
        System.out.println(s);

        // 5.向接收端B回复“好的,明天见”
        data = "好的,明天见".getBytes();
        packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.107"), 9998);
        // 6.发送数据包
        socket.send(packet);
        // 5.关闭资源
        socket.close();
        System.out.println("A端退出...");
    }
}

发送端代码实现-UDPSenderB:

package com.cuinn.udp;


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * @author ckwu
 * @version 1.0
 * @project JavaProject
 * @description 发送端B
 * @date 2022-10-06 13:01:00
 */
public class UDPSenderB {
    public static void main(String[] args) throws IOException {
        // 1.创建DatagramSocket对象,准备在9998端口接收数据
        DatagramSocket socket = new DatagramSocket(9998);
        // 2.将需要发送的数据,封装到DatagramPacket对象
        byte[] data = "hello 明天吃火锅~".getBytes();
        // 说明:封装的DatagramPacket对象 data内容字节数组,data.length, 主机(IP),端口
        DatagramPacket packet =
                new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.107"), 9999);
        socket.send(packet);
        // 3.接收发送端A发送的数据报
        data = new byte[1024];
        packet = new DatagramPacket(data, data.length);
        // 4.数据填充到packaet
        socket.receive(packet);
        // 5.拆包
        data = packet.getData();
        int length = packet.getLength();
        String s = new String(data, 0, length);
        System.out.println(s);

        //3.关闭资源
        socket.close();
        System.out.println("");
        System.out.println("B端退出...");
    }
}

总结

Java网络编程章节到这儿基本结束了,后面继续介绍网络文件下载,聊天等相关案例。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿坤...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值