【Java】网络编程-UDP回响服务器客户端简单代码编写

这一篇文章我们将讲述网络编程中UDP服务器客户端的编程代码

1、前置知识

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

UDP的特点有:无连接、尽最大努力交付、面向报文、没有拥塞控制

本文讲的回响服务器是指客户端向服务器发送一个报文,从服务器那里得到一条一模一样的回响报文

该代码需要在同一个包下创建两个类,服务器UdpEchoServer类,客户端UdpEchoClient类

2、服务器端代码

(1)完整代码

先放上完整代码

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

public class UdpEchoServer {
    public static DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        //手动指定服务器端口号
        socket = new DatagramSocket(port);
    }

    public static void start() throws IOException {
        while (true){
            System.out.println("服务器启动");

            DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);
            socket.receive(requestPacket);

            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            String response = process(request);

            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);

            System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);
            System.out.println();
        }
    }

    public static String process(String request){
        return request;
    }

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

}

(2)代码讲解

构造方法中手动指定服务器端口号

public UdpEchoServer(int port) throws SocketException {
    //手动指定服务器端口号
    socket = new DatagramSocket(port);
}

start()方法中进行信息的接收、处理、发送 

public static void start() throws IOException {
        while (true){
            System.out.println("服务器启动");

            //创建接收报文,用socket进行接收请求报文
            DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);
            socket.receive(requestPacket);

            //将请求报文转化为请求字符串,用process()方法进行处理,得到响应字符串
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            String response = process(request);

            //将得到的响应字符串转化为响应报文,并用socket进行发送
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
            socket.send(responsePacket);

            //打印客户端IP地址和端口号信息
            System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);
            System.out.println();
        }
}

process()方法

直接返回接收到的字符串

public static String process(String request){
        return request;
}

3、 客户端代码

 (1)完整代码

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

public class UdpEchoClient {
    public static DatagramSocket socket = null;
    private static String ip = null;
    private static int port = 0;

    public UdpEchoClient(String ip,int port) throws SocketException {
        //系统自动为客户端分配端口
        socket = new DatagramSocket();
        this.ip = ip;
        this.port = port;
    }

    public static void start() throws IOException {
        System.out.println("客户端启动!");
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("->");
            String request = scanner.next();
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);
            socket.send(requestPacket);

            DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);
            socket.receive(responsePacket);

            String response = new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
    }

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

(2)代码讲解

客户端由于可能有多个,所以需要系统自动为客户端分配端口

当初始化socket时,客户端还需要记下服务器端的ip和端口 

public static DatagramSocket socket = null;
private static String ip = null;
private static int port = 0;

public UdpEchoClient(String ip,int port) throws SocketException {
        //系统自动为客户端分配端口
        socket = new DatagramSocket();
        //记录ip和端口号
        this.ip = ip;
        this.port = port;
}

start()方法 

public static void start() throws IOException {
        System.out.println("客户端启动!");
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("->");
            String request = scanner.next();

            //将读取到的字符串转化为请求报文,并用socket进行发送
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);
            socket.send(requestPacket);

            //创建回应报文来接收响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);
            socket.receive(responsePacket);

            //将响应报文转换成字符串,并打印出来
            String response = new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.println(response);
        }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《算法通关村——回溯模板如何解决回溯问题》

《算法通关村——回溯模板如何解决回溯问题》 93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.1…

IDEA2023找不到add framework support怎么解决

问题: 我的idea版本是2023.01,新版idea右键项目没有Add Framework Support,help里面也找不到相关的。 从project structue的facets里面添加就行了,都是一样的。 1.依旧是新建一个项目 2.file-->project structure--->facets 左上角加…

JavaEE 09 锁策略

1.锁策略 1.1 乐观锁与悲观锁 其实前三个锁是同一种锁,只是站在不同的角度上去进行描述,此处的乐观与悲观其实是指在预测的角度上看会发生锁竞争的概率大小,概率大的则是悲观锁,概率小的则是乐观锁 乐观锁在加锁的时候就会做较少的事情,加锁的速度较快,但是消耗的cpu资源等也会…

crmeb v5自动生成代码报错(adminInfo方法或404路由不存在的问题)

404 现象 调试器中出现了404 , 那肯定是路由出了问题,也就是说,crmeb 为我们生成的路由没有对应的加载上,先来看一下, 自动代码为我们生成的路由是什么样子的 所以有一种最简单的解决办法,就是 把 新生成的路由文件从子目录中挪出一级来,就可以解决404的问题了 下面来说…

python学习:浅拷贝与深拷贝详解

copy 一、 & is二、浅拷贝 & 深拷贝(一)、浅拷贝(二)、深拷贝 三、问题 一、’ ’ & ‘is’ ’ 和is是python对象比较常用的两种方式,简单来说,‘ ‘操作符比较对象之间的值是否相等,如 a b 而’is’操作符比较的是对象的身份标识是否相等,即它们是否是同一个…

「玩转 TableAgent 数据智能分析」实战数据分析演练

文章目录 前言TableAgent 功能亮点人人都是数据分析师融合创新应用的新成果 TableAgent 使用介绍登陆功能介绍申请认证 实战数据集分析一导入 CSV 文件数据发起提问TableAgent 应答结果贴切的服务推荐问题提问 实战数据集分析二分析结果分析哪个城市的未来人口最多 总结 TableA…

linux高级管理——访问MYSQL数据库

一、认识数据库系统: MySQL数据库系统也是一个典型的C/S(客户端/服务器)架构的应用,要访问MySQL数据库需要使用专门的客户端软件。在Linux系统中,最简单、易用的MySQL客户端软件是其自带的mysql命令工具。 1.登录到My…

光伏开发设计施工一体化系统都有哪些功能?

随着全球对可再生能源的需求不断增加,光伏行业得到了快速发展。同时也面临着一些挑战,例如初始投资成本高、需要大量土地和水资源等。鹧鸪云光伏与储能软件利用技术创新,促进光伏行业数字化升级。 一、智能测算 1.投融资表:采用…

【FPGA/verilog -入门学习6】verilog频率计数器

需求 在使能信号控制下,计算输入脉冲的每两个上升沿之间的时钟周期数并输出,即输出脉冲频率的计数值 输入信号 周期性脉冲信号:需要做检测的脉冲频率信号 使能信号:高电平进行频率计数,低电平清零计数器 输出信号 计数…

bootstrap:下拉菜单

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>下拉菜单DEMO</title> <link rel"stylesheet" type"text/css" href"/cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css"…

TCP/IP详解——网络基本概念

文章目录 一、网络基本概念1. OSI 7层模型1.1 每层对应的协议1.2 每层涉及的设备1.2.1 物理层设备1.2.2 数据链路层设备1.2.3 网络层设备1.2.4 传输层设备1.2.5 交换机和路由器的应用1.2.6 问题 2. TCP/IP 4层模型3. 物理层传输介质3.1 冲突域 4. 数据链路层4.1 以太网帧结构4.…

​flutter 代码混淆

Flutter 应用混淆&#xff1a;Flutter 应用的混淆非常简单&#xff0c;只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。–obfuscate --split-debug-info 用来指定输出调试文件的位置&#xff0c;该命令会生成一个符号映射表。目前支…

mysql字段设计规范:使用unsigned(无符号的)存储非负值

如果一个字段存储的是数值&#xff0c;并且是非负数&#xff0c;要设置为unsigned&#xff08;无符号的&#xff09;。 例如&#xff1a; 备注&#xff1a;对于类型是 FLOAT、 DOUBLE和 DECIMAL的&#xff0c;UNSIGNED属性已经废弃了&#xff0c;可能在mysql的未来某个版本去…

C#学习笔记 - C#基础知识 - C#从入门到放弃

C# 第1节 C# 简单介绍1.1 C# 是什么1.2 C# 强大的编程功能1.3 C# 发展史1.4 C#与Java区别 第2节 C#程序结构2.1 Hello world2.2 C# 结构解析 第3节 C#基本语法3.1 第1节 C# 简单介绍 1.1 C# 是什么 C# 的发音为“C Sharp”&#xff0c;是一门由微软开发并获得了 ECMA&#xf…

Godot导出Android包报错:无效的包名称

问题描述 使用Godot为项目导出Android平台包时报错&#xff0c;提示&#xff1a;“无效的包名称&#xff1a;项目名称不符合包名格式的要求。请显式指定包名。” 解决办法 修改导出配置项“包->唯一名称”。 该项缺省值“org.godotengine.$genname”不能直接使用&#x…

Java版本+鸿鹄企业电子招投标系统源代码+支持二开+Spring cloud +鸿鹄电子招投标系统

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。为了符合国家电子招投标法律法规及相关规范&#xff0c;…

Debian openmediavault 自建Nas系统共享,raid5与btrfs文件系统无损原数据扩容

一、适用环境 1、企业自有物理专业服务器&#xff0c;一些敏感数据不外流时&#xff0c;使用openmediavault自建NAS系统&#xff1b; 2、在虚拟化环境中自建NAS系统&#xff0c;用于内网办公&#xff0c;或出差外网办公时&#xff0c;企业内的文件共享&#xff1b; 3、虚拟化环…

SD-WAN实现分公司与总部组网高效互联

随着企业的发展和扩张&#xff0c;对于分公司和总部的组网需求越来越多。然而企业分公司和总部之间的组网连接通常十分复杂&#xff0c;不仅消耗大量的预算&#xff0c;还耗费很长的部署时间。SD-WAN的出现使组网连接变得轻松、简单&#xff0c;提高了企业的网络连接效率和性能…

珠宝销售技巧培训之如何提升珠宝销售技巧

珠宝销售技巧培训之如何提升珠宝销售技巧 珠宝销售是一项需要技巧和策略的工作。在竞争激烈的珠宝市场中&#xff0c;销售人员需要不断提升自己的销售技巧&#xff0c;以吸引更多的客户并保持他们的忠诚度。本文将介绍一些提升珠宝销售技巧的方法&#xff0c;包括了解客户需求…

智能配电运维管理平台

智能配电运维管理平台是一种集成了自动化、智能化等技术手段的电力运维管理平台。依托智慧化工具-电易云&#xff0c;对配电系统的电力设备进行实时监控、数据分析和处理。该平台通常由数据采集、监控预警、计划维护、数据分析、决策支持等模块组成&#xff0c;能够实现电力设备…