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

news2024/12/21 10:21:14

作者:困了电视剧

专栏:《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/505277.html

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

相关文章

Postman完全卸载步骤

一、卸载应用程序 我们首先正常右键点击卸载通过windows程序卸载功能来卸载postman应用程序。 二、删除文件 (1)删除AppData》Roadming下的postman文件夹 (2)删除AppData》Roadming》\Microsoft\Windows\Start Menu\Programs下的p…

态势感知与信质、信量

未来的新智能是人机环境系统智能,而人机融合的态势感知是其关键,简单地说,态势感知(situation awareness)就是智能体在“一定时间和空间环境中的元素的感知,对它们的含义的理解,并对他们稍后状态…

uni——调用子组件失败解决方法($nextTick)

案例说明 调用子组件内的方法或者属性赋值报错的 this.$refs.goodsOrder.list [ ]解决代码 在外层包裹this.$nextTick(() > { 数据 }) this.$nextTick(() > {this.$refs.goodsOrder.list [] })

【JAVA面试】JVM

提示:文章先作为初版,等后续时间充足后,补充更深的内容 文章目录 JVM一、垃圾回收算法二、什么是STW三、JVM参数四、JVM内存模型 JVM 一、垃圾回收算法 JVM中的垃圾回收算法可以分为两种类型:基于引用计数的垃圾回收算法和基于可…

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考…

【Unity3D】Shader变体管理流程-变体剔除

一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如说,这个是否支持阴影,此时就需要加keyword(…

强化学习p1-基本概念

Terminologies(名词) 状态(State) 每个时刻,环境有一个状态 (state),可以理解为对当前时刻环境的概括 状态(State) 有时也被称为观测(Observation),因为有时智能体并不能观测到环境改变后的全部,只能观测到部分。 环境(Environm…

计算机毕业论文内容参考|软件工程|网络流量异常信息分析方法研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 网络流量异常信息分析方法研究 文章重点 摘要 本课题针对网络安全中网络流量异常的分析方法进行研究,提出一种基于机器学习和深度学习的异常检…

OpenCV教程——处理图像像素及图像掩膜

1.像素值 像素值是图像被数字化时由计算机赋予的值,代表了图像中某一小方块(即【像素点】)的平均亮度信息。 灰度图像通常用8位表示一个像素,这样总共有256个灰度等级(像素值在0~255之间)。 …

最值得推荐的免费分区管理软件

磁盘管理是 Windows 的内置工具,用于操作硬盘上的分区,但自 Windows XP 以来直到Windowa11 该程序几乎没有变化。个人测试了五个备选方案,以了解它们之间的比较。 奇客分区 默认的分区个数根据磁盘大小?需要重新划分分区&#xf…

2023/5/8总结

JAVA基础知识(2) 1.方法 1、方法定义 格式:public static void 方法名(){ //方法体 } 2、方法调用 格式:方法名(); 3、方法的通用格式 public static 返回值类型方法名&…

Camtasia2023官方中文版免费下载

在现在的网络互联网时代,越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频,也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音,做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

【机组组合】基于数据驱动的模型预测控制电力系统机组组合优化【IEEE24节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL ---- 事务

事务 1、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撒销操作请求,即这些操作要么同时成功,要么同时失败。 在实际的开发过程中,一个业务操作如&am…

如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)

如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows) 如何制作 ESXi USB 启动盘 请访问原文链接:https://sysin.org/blog/create-bootable-esxi-usb-installer/,查看最新版。原创作品,转载请保留出处。 作者主页:sysi…

第四十六章 Unity 布局(上)

学习了UI元素的使用,并不能构建出一个完整的UI界面,我们需要使用一些方法将这些UI元素按照“设计稿”的效果,将其摆放到对应的位置上。如何摆放这些UI元素,就是我们需要讲的“布局”,当然这需要借助一些布局组件来完成…

SpringBootFoundation

SpringBootFoundation 一. 项目创建1.1 创建项目1.2 并调整pom.xml1.3 创建子项目1.4 配置子项目pom1.4.1 使用`csmall-server`作为父项目 并且 添加依赖项1.5 关于聚合项目二. YAML语法的配置2.1 关于YAML语法一. 项目创建 1.1 创建项目 本项目是一个聚合项目的结构,首先,创…

clickhouse集群部署指南

一、前言: 上篇文章介绍了clickhouse单机部署指南,本章重点介绍下集群部署指南,文章重在实战,相关知识请自行学习。 二、环境准备: CentOS7 4核16G 3台(172.25.16.82、172.25.16.83、172.25.16.84) 三、安装包准备…

第三方ipad笔哪个牌子好用?ipad触控笔推荐平价

至于选择苹果原装的电容笔,还是平替的电容笔,要看个人的需求而定,比如画图用的,可以用Apple Pencil;比如学习记笔记用的,可以用平替电容笔,目前的平替电容笔无论是品质还是性能,都非…

【Linux】Linux环境下安装Jenkins(图文解说详细版)

文章目录 前言1、在根目录下创建文件夹2、下载linux jenkins3、 进入jenkins目录解压,解压命令:4、启动5、访问一下,浏览器访问:http://服务器IP:8080/ 前言 首先安装Jenkins之前,linux中必须安装好了JDK和Maven,如果…