[网络编程]UDP协议,基于UDP协议的回显服务器

这篇具有很好参考价值的文章主要介绍了[网络编程]UDP协议,基于UDP协议的回显服务器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.UDP协议介绍

2.UDP协议在Java中的类

2.1DatagramSocket类

2.2DatagramPacket

3.回显服务器

3.1Sever端 

3.2Client端

1.UDP协议介绍

  UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输的应用,如DNS查询 SNMP等。一次UDP数据报报文传输的数据最大为64kb,实际上,UDP因为头部占用八个字节。所以可传输的精准大小为64kb-8b = 65507字节。

2.UDP协议在Java中的类

 UDP协议作为传输层协议,在Java中我们无需面对原生UDP协议,我们只需要调用Java封装好的类来使用UDP协议来传输和接受数据即可。在Java中有两个类,分别是DatagramSocket类和DatagramPacket类。

2.1DatagramSocket类

DatagramSocket用于创建Socket,绑定到端口号。它将网卡抽象成文件来方便程序猿来来操作。

DatagramSocket类的构造方法:
[网络编程]UDP协议,基于UDP协议的回显服务器,网络,udp,服务器DatagramSocket类里的方法:

方法签名 方法说明
void
receive(DatagramPacket p)
从此套接字接收数据报(如果没有接收到数据报,该方法会阻
塞等待)
void send(DatagramPacket
p)
从此套接字发送数据报包(不会阻塞等待,直接发送)
void close() 关闭此数据报套接字

2.2DatagramPacket

DatagramPacket是UDP Socket发送和接收的数据报

DatagramPacket的构造方法:

方法签名 方法说明
DatagramPacket(byte[]
buf, int length)
构造一个DatagramPacket以用来接收数据报,接收的数据保存在
字节数组(第一个参数buf)中,接收指定长度(第二个参数
length)
DatagramPacket(byte[]
buf, int offset, int length,
SocketAddress address)
构造一个DatagramPacket以用来发送数据报,发送的数据为字节
数组(第一个参数buf)中,从0到指定长度(第二个参数
length)。address指定目的主机的IP和端口号

DatagramPacket的方法:

方法签名 方法说明
InetAddress
getAddress()
从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取
接收端主机IP地址
int getPort() 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获
取接收端主机端口号
byte[] getData() 获取数据报中的数据

3.回显服务器

为了方便大家理解和更好的使用UDP协议中的这两个类来实现网络编程,跨主机通信。

我们来写个简单的客户端-服务器程序-回显服务器,客户端将数据发送到服务器上,服务器在返回给客户端这个数据并且打印下来。主要目的是为了方便大家理解。

3.1Sever端 

在Sever端写之前,我们先讲明白几件事,首先就是我们的构造方法要不要指定端口号。答案是肯定的,因为这是服务器端,客户端想要访问它,肯定要有一个固定的地址,不然如何去访问,所以在构造方法中,我们直接从1024-65535这些端口号中选择一个给绑定上。

还有就是我们的主要逻辑过程:

1.接受数据并解析

2.将这个数据进行服务器的操作,即根据请求计算响应。

3.将响应返回给客户端。

明白了这些以后,我们开始编写代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoSever {
    DatagramSocket socket = null;
    public UdpEchoSever (int sort) throws SocketException {
        socket = new DatagramSocket(sort);//因为是服务器程序,所以我们要指定端口号
    }
    public void start() throws IOException {
        while (true){ //这里的while(true)是因为会有很多客户端来访问这个服务器,所以我们的服务器是7*24小时运行的
            System.out.println("服务器启动");
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length); //创建一个数据报用来接收,这是一个输出型参数
            socket.receive(packet); //如果没有客户端进行访问,就会进行阻塞等待
            String request = new String(packet.getData(),0, packet.getLength()); //将这个数据报解析成字符串的形式
            String response = fun(request);
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,packet.getSocketAddress());
            //在构造的时候要将数据报转化为字符数组,并且指定IP地址和端口号发送,这里我们的IP地址和端口号,已经被存入到,packet.getSocketAddress()里面了
            System.out.printf("[%s :%d] req:%s,resp : %s\n",responsePacket.getAddress().toString(),responsePacket.getPort(),request,response);
            socket.send(responsePacket);
        }
    }

    private String fun(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoSever udpEchoSever = new UdpEchoSever(9090);
        udpEchoSever.start();
    }
}

3.2Client端

至于客户端,我们的逻辑就是,在构造方法里,要传入服务器的IP地址和端口号,以方便后续使用。

至于主方法,我们的大概思路分为以下几步
1.用户通过控制台输入,并且构造成DatagramPacket数据报,此时这个类里面应该有我们的数据和IP地址以及端口号

2.将这个数据报发送给服务器

3.从服务器拿到响应并且解析

4.将解析的响应打印出来

现在我们开始编程:

import javax.xml.ws.soap.Addressing;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
    DatagramSocket socket = null;
    int severport;
    String severIp;
    public UdpEchoClient(String severIp,int severport) throws SocketException { //在构造方法中传入服务器的IP地址和端口号
        socket = new DatagramSocket();
        this.severIp = severIp;
        this.severport = severport;
    }
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("客户端启动");
        while (true){
            System.out.print("->");
            if(!scanner.hasNext()){ //用户输入到回车等这些空字符以后就结束
                break;
            }
            String request = scanner.next();
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(severIp),severport); //将数据以及IP地址(这里的IP地址是字符串,
            // 所以我们需要调用InetAddress.getByName())以及端口号也写进去
            socket.send(requestPacket);//发送到服务器
            byte[] bytes = new byte[1024];
            DatagramPacket responsPacket = new DatagramPacket(bytes,bytes.length);//同样是输出型参数,所以要先有一个空的字符数组
            socket.receive(responsPacket);//接收服务器传来的响应
            String respons = new String(responsPacket.getData(),0,responsPacket.getLength());//将响应转化为字符串
            System.out.println(respons);//打印下来
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient udpEchoClient = new UdpEchoClient("127.0.0.1",9090);
        udpEchoClient.start();
    }
}

我们来看看运行结果

[网络编程]UDP协议,基于UDP协议的回显服务器,网络,udp,服务器

 可以看到客户端没有问题。我们再来看看服务器端的控制台:

[网络编程]UDP协议,基于UDP协议的回显服务器,网络,udp,服务器也和我们预期的结果一样文章来源地址https://www.toymoban.com/news/detail-814293.html

到了这里,关于[网络编程]UDP协议,基于UDP协议的回显服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

    TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示\\\"TCP数据报\\\"因为TCP不是以数据报为单位进行传输的.是以字节的方式,流式传输 ServerSocket API ServerSocket 是专门给服务器使用的Socket对象. ServerSocket 构造方法: ServerSocket(int port) 创建一个服务端流套接字Socket,并绑

    2024年02月12日
    浏览(43)
  • JavaEE & UDP简易翻译服务器 & 网络编程示例2 & TCP回显服务器,回显客户端

    禁止白嫖 T T 点点赞呗 这个翻译器主要是在上一章的回显服务器和回显客户端上进行修改 修改了计算响应的过程, 即process方法 1.1 重写方法 重写方法是Java中的一种重要手段 指在一个类的子类里,对父类的一个方法进行重新定义! 而父类的权限级别要大于等于子类~ 【除了

    2023年04月16日
    浏览(40)
  • JavaEE & UDP简易翻译服务器 & 网络编程示例2 & CTP回显服务器,回显客户端

    禁止白嫖 T T 点点赞呗 这个翻译器主要是在上一章的回显服务器和回显客户端上进行修改 修改了计算响应的过程, 即process方法 1.1 重写方法 重写方法是Java中的一种重要手段 指在一个类的子类里,对父类的一个方法进行重新定义! 而父类的权限级别要大于等于子类~ 【除了

    2023年04月16日
    浏览(44)
  • 【Java 网络编程】网络通信原理、TCP、UDP 回显服务

    互联网从何而来? 这要追溯到上个世纪 50 - 60 年代,当时正逢美苏争霸冷战, 核武器 给战争双方提供了足够的威慑力,想要保全自己,就要保证自己的 反制手段 是有效的。 如何保证能够反击: 保存指挥机构 保存核弹头和发射井 指挥机构和核弹头之间的通信链路 需要保证

    2023年04月10日
    浏览(32)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(42)
  • 《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

    目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 ① TCP 提供的是可靠数据传输服务,而 UDP 提供的是不可靠数据传输服务; ② UDP 在结构上比 TCP 更简洁,其不会

    2024年02月09日
    浏览(48)
  • 【skynet】 网络编程之回显服务器

    skynet 提供了一套 tcp 的 API ,本文将给出简单的回显服务器实现,以及讲解。 拉取 skynet 工程 编译 负责启动 gate 服务 \\\"L\\\" 表示客服端的消息前带四字节大端序的 msg_size skynet.address(skynet.self()) 把自己设置为 watchdog ,有新连接通过 text 消息告诉自己 port TCP 监听端口 0 将 TCP 数据

    2024年04月25日
    浏览(28)
  • 【网络编程】TCP流套接字编程(TCP实现回显服务器)

    Socket(既能给客户端使用,也能给服务器使用) 构造方法 基本方法: ServerSocket(只能给服务器使用) 构造方法: 基本方法: 客户端代码示例: 服务器代码示例: 运行结果: 代码执行流程: 服务器启动,阻塞在accept,等待客户端建立连接. 客户端启动.这里的new操作会触发和服务器之间建立连

    2024年04月25日
    浏览(50)
  • [C++ 网络协议编程] UDP协议

    目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 主要区别: TCP和UDP的主要区别是,TCP具有流控制机制,而UDP没

    2024年02月12日
    浏览(29)
  • 【网络编程】TCP,UDP协议详解

    小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~   目录 前言 TCP协议 TCP协议特点 TCP协议通信场景 TCP协议的几个重要机制 一、

    2023年04月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包