UDP通信(二)上

简介: 网络通信,是 C/S 模式,需要编写 客户端和服务器端的代码, 服务器端需要指定端口号, 客户端需要指定 服务器的ip地址和端口号,这样才能保持连接通信, 网络通信,需要先开启服务端,才能启动客户端。

网络通信,是 C/S 模式,需要编写 客户端和服务器端的代码, 服务器端需要指定端口号, 客户端需要指定 服务器的ip地址和端口号,这样才能保持连接通信, 网络通信,需要先开启服务端,才能启动客户端。


还需要了解一点, 客户端的输入,连接的是服务器端的输出, 客户端的输出,连接的是服务器端的输入。


一. UDP 通信所需要用到的类


一.一 DatagramSocket 类


这是服务器端的类, 需要指定接口。


一.一.一 构造方法


一.一.一.一 方法


image.png


一.一.一.二 演示


   @Test
    public void conTest(){
        try {
            //绑定的是本机
            DatagramSocket datagramSocket=new DatagramSocket(9999);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        try {
            //绑定到指定的服务器
            InetAddress inetAddress=InetAddress.getByName("localhost");
            DatagramSocket datagramSocket=new DatagramSocket(9999,inetAddress);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }catch (SocketException e) {
            e.printStackTrace();
        }
    }


一.一.二 其他常用方法


image.png


发送时和接收数据时,发送和接收的是一个对象, DatagramPacket, 这个对象里面封装了真正的通信数据。


一.二 DatagramPacket


数据封装包。


一.二.一 构造方法


一.二.一.一 方法


image.png


一.二.一.二 演示


 @Test
    public void packetConTest(){
        //定义的是byte 字节
        byte[] bytes=new byte[1024];
        //第一种,从客户端接收数据
        DatagramPacket datagramPacket=new DatagramPacket(bytes,0,1024);
        InetAddress inetAddress= null;
        try {
            inetAddress = InetAddress.getByName("localhost");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        //第二种,接收固定 主机
        DatagramPacket datagramPacket1=new DatagramPacket(bytes,0,1024,inetAddress,6666);
        //第三种, 在客户端发送数据到服务器端
        DatagramPacket datagramPacket2=new DatagramPacket(bytes,0,1024,new InetSocketAddress("localhost",6666));
    }


一.二.二 其他方法


image.png


二. 演示各种 UDP 通信


二.一 单条字符串数据


二.一.一 客户端


  @Test
    public void send1Test() throws Exception{
        //1. 定义客户端
        System.out.println("------------发送方开始发送单条数据--------------");
        //客户端端口
        DatagramSocket datagramSocket=new DatagramSocket(6666);
        //2. 准备数据
        String content="你好啊,我是两个蝴蝶飞";
        //3. 将数据转换成字节数据
        byte[] bytes=content.getBytes("UTF-8");
        //4. 封装进包
        InetAddress inetAddress=InetAddress.getByName("localhost");
        //服务器为 localhost,端口为 9999
        DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length,inetAddress,9999);
        //发送数据
        datagramSocket.send(datagramPacket);
        //关闭流
        datagramSocket.close();
    }


二. 演示各种 UDP 通信


二.一 单条字符串数据


二.一.一 客户端


  @Test
    public void send1Test() throws Exception{
        //1. 定义客户端
        System.out.println("------------发送方开始发送单条数据--------------");
        //客户端端口
        DatagramSocket datagramSocket=new DatagramSocket(6666);
        //2. 准备数据
        String content="你好啊,我是两个蝴蝶飞";
        //3. 将数据转换成字节数据
        byte[] bytes=content.getBytes("UTF-8");
        //4. 封装进包
        InetAddress inetAddress=InetAddress.getByName("localhost");
        //服务器为 localhost,端口为 9999
        DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length,inetAddress,9999);
        //发送数据
        datagramSocket.send(datagramPacket);
        //关闭流
        datagramSocket.close();
    }


二.一.二 服务器端


@Test
    public void send1Test() throws Exception{
        //1. 定义服务器
        System.out.println("---------------服务器启动成功,接收单条数据----------------");
        DatagramSocket datagramSocket=new DatagramSocket(9999);
        //2. 设置数据,封装到 bytes字节数据, 这个数组可能是不够用的。
        byte[] bytes=new byte[1024];
        //能接收的大小,并不是实际接收的大小
        DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length);
        //3. 阻塞式接收传递过来的数据
        datagramSocket.receive(datagramPacket);
        //4. 获取接收的数据, 是真实的数据。 
        byte[] content=datagramPacket.getData();
        int len=datagramPacket.getLength();
        System.out.println("接收的长度是:"+len+",接收的内容是:"+new String(content,0,len));
        //5 关闭流
        datagramSocket.close();
    }


二.一.三 运行程序


先打开服务器端,


20200625121838452.png


一直在阻塞式接收客户端


再打开客户端


20200625121843154.png


这个时候,再查看一下服务器端


20200625121847900.png



相关文章
|
30天前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
35 0
Linux C/C++之TCP / UDP通信
|
6月前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
68 3
|
2月前
|
C语言
C语言 网络编程(七)UDP通信创建流程
本文档详细介绍了使用 UDP 协议进行通信的过程,包括创建套接字、发送与接收消息等关键步骤。首先,通过 `socket()` 函数创建套接字,并设置相应的参数。接着,使用 `sendto()` 函数向指定地址发送数据。为了绑定地址,需要调用 `bind()` 函数。接收端则通过 `recvfrom()` 函数接收数据并获取发送方的地址信息。文档还提供了完整的代码示例,展示了如何实现 UDP 的发送端和服务端功能。
|
3月前
|
网络协议 数据处理 C语言
网络编程进阶:UDP通信
网络编程进阶:UDP通信
165 0
|
3月前
|
C语言
【C语言】UDP通信
【C语言】UDP通信
36 0
|
4月前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
184 1
|
4月前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
6月前
|
网络协议 安全 Java
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
55 1
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
|
4月前
基于QT实现的QQ聊天简易版(UDP通信版)
源码已经给小伙伴们整理好了,微信搜索 嵌入式工程之家 关注公众号回复 QQ 即可获得源码和详细操作指示哦~
100 0
|
5月前
UDP通信
UDP通信
33 1