【来点小剧场--爪哇岛寻宝】java实现网络编程,UDP协议写一个简易的回显服务程序

news2024/9/20 9:05:49

作者:困了电视剧

专栏:《JavaEE初阶》

文章分布:这是一篇关于网络编程的文章,在这篇文章中我会剖析一段回显服务程序的执行步骤和代码编程,希望对你有所帮助!

目录

客户端

服务端 

总结


客户端

现在我们是客户端,我们需要知道的是与我们对应的服务端的ip地址和端口号以知道服务器在哪,同时我们还需要一个对象socket——网卡的抽象表示,以操控网卡进行通信。

定义好成员变量之后,我们需要写一个构造方法:

这里不要求客户端的ip地址和端口号,是因为我们需要解决问题的服务端是固定的,所以我们需要知道服务端的ip以方便找到,而客户端可以是任意一个有相关需求的机子。

并且在进行一次网络通信的过程中,是客户端先给服务端发送请求,然后服务端再给客户端发送响应。在这期间客户端需要地址以找到服务端,而服务端可以根据发来的数据报中包含的地址信息找到客户端。

这个start方法就是客户端与服务端进行交互进行的步骤可分为:先输入请求,然后调用方法将请求和ip地址端口号等打包成一个UDP数据报,然后socket将这个数据报进行发送,发送完之后创建一个空的数据报(本例中是responsePacket)用来接受发来的响应,我们可以调用相关方法将响应放到字符串中并打印出来。

具体代码如下:

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

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIP;
    private int serverPort;

    //客户端启动,需要知道服务器在哪里
    public UdpEchoClient(String serverIP,int serverPort) throws SocketException {
        //对于客户端来说,不需要显示关联端口
        //不代表没有端口,而是系统自动分配了个空闲的端口
        socket = new DatagramSocket();
        this.serverIP = serverIP;
        this.serverPort = serverPort;
    }

    public void start() throws IOException {
        // 通过这个客户端可以多次和服务器进行交互
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("->");
            //request就是请求
            String request = scanner.nextLine();
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIP),serverPort);
            socket.send(requestPacket);
            //空的数据报以接受响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response = new String(responsePacket.getData(),0,responsePacket.getLength());
            System.out.printf("req: %s, resp: %s\n", request, response);

        }
    }

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

服务端 

由于服务端并不需要知道客户端的ip地址和端口号,所以只需要构造一个socket对象即可。

因为这是服务端,所以需要等待客户端发送的请求才能执行相应的逻辑,所以在接收之前要先构造一个空的数据报用来接收请求 

为了方便我们处理这个请求,我们可以调用相关的方法将这个数据包装成字符串,然后我们通过我们自己写的process方法来处理这个请求,这里用process方法封装处理过程可以大大提高代码的可读性,执行完后将响应包装成数据报进行发送,我们可以通过getSocketAddress方法来获取发来的客户端的ip地址和端口号,封装完成后,再调用send方法发送响应即可。

由于我们写的是回显服务器,所以处理的业务就是将客户端发来的信息在发送给客户端。

最后在main方法中开启服务端。 

完整代码如下: 

public class UdpEchoServer {
    //首先先定义一个socket对象
    //通过网络通信,必须要是用socket对象,通过这个对象来操作网卡
    private DatagramSocket socket = null;

    //绑定一个端口

    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    //启动服务器的主逻辑
    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            //每次循环,要做三件事
            //1.读取请求并解析
            //  构造空饭盒
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //为了方便处理这个请求,把数据包装成String
            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\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, response);
        }
    }

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

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

总结

我们在运行一套客户端和服务端的时候,一定是要先开启服务端在开启客户端,这样才能运行。

大体流程就是:客户端先向服务端发送一个请求,然后服务端接受请求处理业务,处理业务完成后将响应再发送给客户端,客户端拿到发来的响应后进行下一步的工作。

以上就是本篇博客的全部内容,如有疏漏欢迎指正!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓机上 4G 内存跑 Alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM

从 LLM 火爆以来,社区已经出现了非常多优秀的模型,当然他们最大的特点就是体积大。最近为了让大模型可以在更低端的设备上运行,社区做了非常多的工作, gptq 实现了将模型进行低比特量化,因此降低了运行大模型对 CPU 内…

Install4j V10安装及简单使用

版本 install4j v10.0(附激活流程) 下载地址 脚本之家夸克网盘 安装 点击Crack生成License 安装后粘贴在最后一步: 实战 准备 之前做过一个git-agent的demo, 本意是用来学习Netty的, 其中包括git-server和git-cli, 我们以git-server为原材料(可执行jar包)进行演示, …

【数据结构与算法】树状数组

Fenwick Tree 树状数组(Binary Indexed Tree,又称 Fenwick Tree)是一种基于数组实现的数据结构,用于高效地动态维护前缀和。 树状数组可以在 O ( log ⁡ n ) O(\log n) O(logn) 的时间复杂度内进行单点修改和前缀求和操作&#x…

Android studio使用glade7.5编译通过opencv官方例程camera_calibration

Opency官方例程是用glade4.2.1构建的,所以想使用glade7对官方例程重新构建。由于自己对android studio的glade架构不熟悉,走了不少弯路,刚开始使用glade7重新编译opencv官方例程,编译能通过,但是app总是会闪退。 下面这…

ArcGIS API for JavaScript 3.x 添加动态波纹标注

模拟波纹效果基于 arcgis 3.x, 先看效果图: 实现思路 波纹是由两个图层组成,圆点动态圆,主要借助于esri/geometry/Point和esri/symbols/SimpleMarkerSymbol,这两个类。 Point创建点, SimpleMarkerSymbol创建一个圆&#xff0c…

理化生实验室常用实验仪器清单及用途说明

理化生实验室除了常见的玻璃器皿,作为实验室中同样重要的一部分,实验仪器也是不可或缺,其可以有效地提高实验精度与效率。下面,就为大家盘点一下实验室都有哪些常见的实验仪器。 显微镜的用途主要用于放大微小物体成为人的肉眼所…

Acceptance-Rejection Sampling

Acceptance-Rejection Sampling 文章目录 Acceptance-Rejection Sampling[toc]1 接受拒绝采样2 Acceptance-Rejection 采样实现 1 接受拒绝采样 给定随机变量 X X X服从pdf为 f ( x ) f(x) f(x)的分布,例如 f ( x ) f(x) f(x)为正态概率密度函数,我们可…

js 字符串拼接的4种方法

一、使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console.log(a) // 我是帅哥 二、模板字符串 模板字符串(template string)是增强版的字符串,用反引号()标识,特点&#xff1a…

【C++】-6- 模板初阶

文章目录 引入——泛型编程一、函数模板1.函数模板格式2.函数模板原理3.模板的实例化4.模板参数的匹配原则 二、类模板0.引入1.类模板的定义格式2.类模板的实例化 引入——泛型编程 如果我们需要实现不同数据类型的Swap函数,需要手写很多内容类似的结构。如下。 v…

【Gragph Data Mining】VF2算法 — 图同构匹配的算法

VF2算法是一种用于图同构匹配的算法,可以判断两个图是否同构。VF2算法最初由L. P. Cordella等人在1981年提出,后经过多次改进和优化,已成为常用的图同构匹配算法之一。VF2算法的基本思想是通过递归地搜索两个图的节点匹配,从而判断…

总结847

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

概率密度函数可视化

概率密度函数可视化 文章目录 概率密度函数可视化[toc]1 一维随机变量情形2 二维随机变量情形 1 一维随机变量情形 以正态概率密度函数为例,其中位置参数为 μ \mu μ,尺度参数为 σ \sigma σ, f ( x ) 1 2 π σ e − ( x − μ ) 2 2 σ…

ChatGPT聊天新玩意:如何让AI成为你的聊天好友?

目录 引言: 案例: 淄博旅游第一版本: 分析: 淄博旅游第二版本: 分析: 总结: 万能公式: 引言: ChatGPT是什么?今天用一句话概括,它就是新…

翻译: 面向开发人员的GPT提示工程 GPT Prompt Engineering for Developers

1. 提示指南Guidelines for Prompting 在本课中,您将练习两个提示原则及其相关策略,以便为大型语言模型编写有效的提示。 In this lesson, you’ll practice two prompting principles and their related tactics in order to write effective prompts …

7搜索管理

7搜索管理 7.1 准备环境 7.1.1 创建映射 创建xc_course索引库。 创建如下映射 post:http://localhost:9200/xc_course/doc/_mapping 参考 “资料”–》搜索测试-初始化数据.txt { "properties": { "description": { "type": &…

C语言操作符详解

该内容全部代码请看:gitee仓库 第一部分: 板书部分: 1、操作符的分类: 注意: 移位操作符和位操作符 单目操作符中有sizeof 逗号表达式 2、算术操作符: 注意: 除法的使用 取模运算 3、移位操…

485接口的温湿度传感器和RJ45接口的温湿度传感器选择分析

工业以太网RJ45接口 网口温湿度传感器和RS485信号输出温湿度传感器的分析对比 主要适用场合:大型厂房、跨区域机房、多机房、机柜、数据机房、服务器机房、大数据中心、户外电站等 主要区别:以太网温湿度传感器输出信号RJ45,RS485温湿度传…

【JAVA面试】缓存穿透、缓存击穿、缓存雪崩

提示:文章先作为初版,等后续时间充足后,补充更深的内容 文章目录 缓存穿透、缓存击穿、缓存雪崩一、区别二、线程安全问题 缓存穿透、缓存击穿、缓存雪崩 一、区别 缓存穿透(Cache Penetration): 缓存穿…

展会邀请丨虹科诚邀您5月12日于北京参与制药行业质量控制技术论坛

2023年上半年,虹科圆满举办了成都CPQC与杭州药安大会,在两场顺利进行的展会上,虹科的产品广受青睐,也获得了许多客户的认可与信赖,虹科也将继续以优质的产品和解决方案解决您的问题。 5月12-5月13日,虹科将…

卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及,对地观测已具备多次以上的全球覆盖…