一个最简单的网络编程

今天总结一下,我至今学的第一个网络编程,也是一个最简单的网络编程。

这篇博客只是将如何用代码实现一个网络编程,具体细节不讲解,后续会介绍详细细节。

网络编程会涉及到客户端和服务器的实现。

1.服务器的实现

首先,服务器的接受请求和发送响应的功能,我们通过DatagramSocket类的实例化对象来实现,一般对于服务器,我们一般希望服务器有一个固定的端口号,所以在创建DatagramSocket对象时,一般会固定一个端口号。

接着,我们在一个start方法中具体实现服务器的功能。

首先,我们需要一个UDP数据包来保存客户端发送来的请求,这个UDP数据报可以通过DatagramPacket类来实现

如上图,requestPacket就是来保存客户端发送来的请求,请求的具体内容是保存在构造方法中的byte数组中,注意,此时请求的内容还没有保存到byte数组里面,我们只是构造了一个保存请求内容的载体,还未初始化。 

接着通过socket对象的receive方法来接受客户端发送来的请求

这里receive方法中的requestPacket是一个返回型参数,则经过该方法后,requestPacket的byte数组已经初始换完成了。

注意:当服务器没有接受到客户端发送来的请求时,时会阻塞在receive方法这里的。

接着,接受到客户端发送来的请求之后,我们就要解析请求中的内容。 

 

由于在网络中,数据的发送都是将数据转换为二进制来发送,这里我们就是将二进制还原成字符串。

这里的requestPacket.getData方法是获取保存请求内容的byte数组,而 requestPacket.getLength方法可以获取到byte数组中的有效长度。

再接着,我们就要对请求进行响应,由于,我们这里实现的是回显型服务器,所以请求和响应是相同的,相当于这步骤省略了。

再接着,我们就要将响应返回给客户端,此时,我们也要建立一个UDP数据报来存储响应,不过在建立响应的数据报的时候,由于UDP数据报没有保存对端的ip地址和端口号,所以我们要将目的IP和目的端口号明确,因为服务器返回响应时,我们要明确将响应返回到哪一个客户端。 

接着将响应数据包发送给客户端,也就是返回响应,通过send方法来实现。

最后,我们来打印请求内容和响应内容

getAdress方法用来获取ip地址,getPort方法用来获取端口号。 

服务器完整代码实现

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdEchoServer {
    //通过socket对象来实现接受请求和发送响应
    DatagramSocket socket=null;
    public UdEchoServer(int port) throws SocketException {
        //port是服务器的固定端口号
        socket=new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);

            socket.receive(requestPacket);

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

            String response=process(request);

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

            socket.send(responsePacket);

            System.out.printf("[%s, %d] request: %s, response: %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
        }
    }

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

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

2.客户端的实现

首先,客户端的作用就是向服务器发送请求和接收服务器返回的响应,所以,我们也是要通过DatagramSocket类的实例化对象来实现发送和接受功能。

不过此时数据通过UDP数据报来发送和接收的,而UDP是不保存对端的IP和端口号,所以此时我们可以在客户端的代码中记录服务器的IP和端口号。

还有对于客户端,我们希望客户端的端口号是随机的。

接下来,我们也在一个start方法里面实现客户端中的具体功能。

首先,需要设计一个用户输入请求的功能。

然后再建立一个DatagramPacket对象(UDP数据报)来保存请求的内容,在建立这个UDP数据报时,我们也要明确对端IP和对端的端口号。

InetAddresss.getByName()方法将IP地址转换为。

接着,存储好数据后就要将请求发送给服务器,通过send方法来实现

在接着就要读取服务器的响应,并解析出响应的内容

这一步,我们还要创建一个DatagramPacket对象来保存响应的内容,并通过receive方法来接收服务器的响应和初始化DatagramPacket对象。

 

最后打印响应的内容 

客户端完整代码

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

public class UdEchoClient {

    DatagramSocket socket=null;

    public String serverIp;//客户端端IP地址
    public int serverPort;//客户端端口号

    public UdEchoClient(String serverIp,int serverPort) throws SocketException {
        this.serverIp=serverIp;
        this.serverPort=serverPort;
        socket=new DatagramSocket();//不传参,会随机分配一个端口号给客户端
    }

    public void start() throws IOException {
        Scanner scanner=new Scanner(System.in);
        while (true){

            System.out.println("请输入你的请求内容");
            String request=scanner.next();

            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.println(response);

        }
    }

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

运行代码

 

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

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

相关文章

Centos开机自启动脚本示例

本文建议创建一个sh文件管理自启动的各项内容,再将sh文件设置开机启动 在/root/autoshell下创建一个autostart.sh,内容如下 #!/bin/bash # description:开机自启脚本# 启动mongodb sh /root/software/mongodb-linux-x86_64-rhel70-4.0.6/bin/mongod --c…

从APP小游戏到Web漏洞的发现

一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下&#xff…

Docker-- cgroups资源控制实战

上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…

从0开始本地部署大模型

这就开始从0开始本地部署大模型 下载Ollama 下载地址:https://ollama.com/download/windows 适用于MacOS、Linux和Windows,这里我下载Windows的安装包。 直接打开安装包,点击install即可,安装完成后可以在任务栏中看到Ollama程…

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

SpringBoot day 1105

ok了家人们&#xff0c;今天继续学习spring boot&#xff0c;let‘s go 六.SpringBoot实现SSM整合 6.1 创建工程&#xff0c;导入静态资源 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…

易盾增强版滑块识别/易盾识别/滑块识别/增强版滑块识别/易盾滑块本地识别

易盾增强版滑块识别 计算思路如下&#xff1a; 滑动条拖动距离传入 restrict 算法处理得到 初次值 J J * 率值0.309375 得到滑块偏移量。 滑块的旋转角度滑块偏移量*attrs 所以滑块偏移量滑块的旋转角度/attrs 通过滑块偏移量 求出 滑动条拖动距离 # 应用高斯模糊warped_…

WPF 特性------Binding

工业控制中&#xff0c;经常会需要把一个bool 型输入信号的状态显示在面板上&#xff0c;使用wpf 绑定的办法&#xff0c;可简洁实现&#xff1a; 实现步骤&#xff1a; 1&#xff0c;定义类&#xff1a; using System; using System.Collections.Generic; using System.Com…

ENSP (虚拟路由冗余协议)VRRP配置

VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;是一种用于提高网络可用性和可靠性的协议。它通过在多个路由器之间共享一个虚拟IP地址&#xff0c;确保即使一台路由器发生故障&#xff0c;网络依然能够正常运行&#xff0c;防止…

计算机网络(Ⅵ)应用层原理

一些网络应用的例子: E-mail Internaet电话 Web 电子支付 文本信息 搜索 P2P文件共享 流媒体 即时通讯 实时电视会议 .... .... 创建一个网络应用&#xff1a; 1.编程 2.在不同的端系统上运行。 网络应用的体系架构 可能的应用架构 1.客户-服…

LeetCode:102. 二叉树的层序遍历(java)

目录 题目描述: 代码: 第一种: 第二种: TreeNode: LinkedListNode: 题目描述: 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,…

openGauss数据库-头歌实验1-4 数据库及表的创建

一、创建数据库 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;创建指定数据库。 &#xff08;二&#xff09;相关知识 数据库其实就是可以存放大量数据的仓库&#xff0c;学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务&#xff0c;你需要掌握&a…

【题解】CF2033G

题目 CF2033G 分析 一道很显然是树形dp的题&#xff0c;但非常恶心QwQ。   先不管复杂度&#xff0c;找找递推关系&#xff0c;一种很直接的想法如下&#xff08;我觉得是错误的&#xff09;&#xff1a; d p [ i ] [ k ] m a x ( d p [ f a i ] [ k − 1 ] , d p [ s o …

unity 中使用zeroMq和Mqtt 进行通讯

最近我在做一个车上的HMI项目&#xff0c;也就是车机应用&#xff0c;需要与云端和域控进行通信。HMI的功能已经外包了&#xff0c;但消息的统一层留给我自己来做。因为项目组其他人都没有经验&#xff0c;所以这个任务就落到了我头上&#xff0c;尽管我自己也没有太多经验&…

Java | Leetcode Java题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution {public int countArrangement(int n) {int[] f new int[1 << n];f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num Integer.bitCount(mask);for (int i 0; i < n; i) {if ((mask & (1…

命令行参数、环境变量、地址空间

命令行参数&#xff1a; int main(int argc, char *argv[ ])&#xff0c;main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。 在linux中会把输入的字符串存到char *argv[ ]中&#xff0c;在数组的结尾为NULL。 命令行参数可以让同一个程序可以通过不同…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数&#xff1a;1. enter_config_mode2. config_commands3. enter_config_mode4. error…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中&#xff0c;通过特定的方法或策略来准确识别和定位页面上的元素&#xff0c;以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

zxing生成、解析二维码,条形码

1、maven依赖 <!--zxing依赖--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupI…