网络通信学习笔记(四)---UDP通信

简介: 网络通信学习笔记(四)---UDP通信

1. UDP协议


这里我们首先需要明白一点,UDP本身就是一种不需要连的协议,所以是不存在客户端与服务端的.


我们通常是通过发送方与接收方的概念来区分,但是我们又需要明白一点发送方与接收方可能是同一个机器.


1.1 UDP消息发送1.0


这里我们还是通过代码来讲解,并且这里我们还是分两个部分来讲.


一是发送方,另一个就是接收方


发送方:


  public static void main(String[] args) throws Exception {
        //建立一个DatagramSocket对象,这里同时我们也开放他的6666端口号,只要开放端口号之后就不存在是发送方还是接收方的概念了,既可以是发送方,也可以是接收方.
        DatagramSocket socket=new DatagramSocket(6666);
        //发送的信息
        String msg="你好啊,服务器!";
        //发送的对象的ip地址以及端口号
        InetAddress localhost=InetAddress.getByName("localhost");
        int port=9999;
        //发送的数据报的各类信息,数据的起始位置,接收方的ip及端口号
        DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
        //发送数据报
        socket.send(packet);
    }

接收方:

public static void main(String[] args) throws Exception{
        //开放端口
        DatagramSocket socket=new DatagramSocket(9999);
        //接收数据报
        byte[]buffer=new byte[1024];
        DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
        //阻塞接受将信息存入到packet对象之中
        socket.receive(packet);
        //打印数据
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭连接
        socket.close();
    }

其实从上面我们也能够看出来UDP就是不需要连接的,因为整个的过程中我们都没有看到ServerSocket这个对象,而是通过 DatagramSocket 这个对象来进行.


其次就是之前我们都是通过 流的形式 来进行数据的传输,但是在UDP中我们则是通过 数据报 的形式来进行,这里其实如果大家学过计算机网络这门课程的话,应该就懂了.


实际效果:


20200917140032668.gif


1.2 UDP消息发送2.0


上面的是我们只能在程序中规定好消息,然后发送,并且整个过程是一次性的,程序执行完就没有了,现在我们编写的就是能够通过键盘输入并且传递信息,并且接收能够持续接受信息,只有当接收到bye这样一个关键字时,我们才退出整个程序.

发送方:


public static void main(String[] args) throws Exception {
        DatagramSocket socket=new DatagramSocket(9999);
        while (true){
            BufferedReader Reader=new BufferedReader(new InputStreamReader(System.in));
            String data= Reader.readLine();
            byte [] bytes=data.getBytes();
            DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",8888));
            socket.send(packet);
            if(data.equals("bye"))
                break;
        }
        socket.close();
    }

接收方:

 public static void main(String[] args) throws Exception {
        DatagramSocket socket=new DatagramSocket(8888);
        while (true){
            byte[] bytes=new byte[1024];
            DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);//阻塞式接收包裹
            socket.receive(packet);
            byte[]newdata=packet.getData();
            String data=new String(newdata,0,newdata.length);
            System.out.println(data);
            if(data.equals("bye"))
                break;
        }
        socket.close();
    }

实际效果:


20200917170158208.gif


1.3 UDP多线程聊天


这里我们会运用到多线程的理念,如果有不了解的建议先去了解一下之后再来学习.

这里我们主要为发送方与接收方两个角色各创建一个线程


TalkSend

public class TalkSend implements Runnable {
    DatagramSocket socket=null;
    BufferedReader Reader=null;
    private String toip;
    private int fromport;
    private int toport;
    public TalkSend(String toip, int fromport, int toport) throws Exception {
        this.toip = toip;
        this.fromport = fromport;
        this.toport = toport;
        socket=new DatagramSocket(fromport);
        Reader=new BufferedReader(new InputStreamReader(System.in));
    }
    @Override
    public void run() {
        while (true){
            try {
                String data= Reader.readLine();
                byte [] bytes=data.getBytes();
                DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress(this.toip,this.toport));
                socket.send(packet);
                if(data.equals("bye"))
                    break;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

TalkReceive

public class TalkReceive implements Runnable {
    DatagramSocket socket=null;
    private String msgfrom;
    private int port;
    public TalkReceive(String msgfrom,int port) throws SocketException {
        this.msgfrom=msgfrom;
        this.port = port;
        socket=new DatagramSocket(port);
    }
    @Override
    public void run() {
        while (true){
            try {
                byte[] bytes=new byte[1024];
                DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);
                socket.receive(packet);
                byte[]newdata=packet.getData();
                String data=new String(newdata,0,newdata.length);
                System.out.println(msgfrom+":"+data);
                if(data.equals("bye"))
                    break;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

创建完发送与接收线程之后,我们就可以创建学生与老师两个用户来实现这个聊天程序.

学生:

public class TalkStudent {
    public static void main(String[] args) throws Exception {
        new Thread(new TalkSend("localhost",7777,9999)).start();
        new Thread(new TalkReceive("老师",8888)).start();
    }
}

教师:

public class TalkTeacher {
    public static void main(String[] args) throws Exception {
        new Thread(new TalkSend("localhost",5555,8888)).start();
        new Thread(new TalkReceive("学生",9999)).start();
    }
}

这里我们只需要稍微注意一下端口号的对应就行了

实际效果:

20200917170215254.gif

里出现中文乱码主要是因为cmd是通过GBK来进行编码的,这里可以自己去设置成UTF-8的编码方式.


相关文章
|
Ubuntu 网络协议 Unix
02理解网络IO:实现服务与客户端通信
网络IO指客户端与服务端通过网络进行数据收发的过程,常见于微信、QQ等应用。本文详解如何用C语言实现一个支持多客户端连接的TCP服务端,涉及socket编程、线程处理及通信流程,并分析“一消息一线程”模式的优缺点。
369 0
|
11月前
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
394 12
|
11月前
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
403 6
|
11月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
347 5
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
356 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
11月前
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
478 0
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
402 11
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
254 3
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
466 3
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
528 0