【Java EE 初阶】网络编程套接字UDP

目录

1.为什么需要网络编程?

2.什么是网络编程?

3.发送端和接收端

4.请求和响应

 5.客户端和服务端

6.如何进行网络编程(Socket套接字)

1.如何进行网络编程

2.TCP与UDP的区别

1.流套接字:使用传输层TCP协议

2.数据报套接字:使用传输层UDP协议

3.举例对比TCP与UDP

7.Java中使用UDP数据报套接字编程

1.类和方法

1.DatagramSocket 构造方法

2.DatagramSocket普通方法

         3.DatagramPacket API

1.DatagramPacket 构造方法

 2.DatagramPacket 方法普通

8.实现一个简单的UDP回显服务器于客户端

服务端步骤:

服务端代码:

2.客户端步骤

客户端代码:

代码如下:

结果展示:


1.为什么需要网络编程?

  • 所谓的网络资源,其实就是在网络中可以获取的各种数据资源。
  • 而所有的网络资源,都是通过网络编程来进行数据传输的

2.什么是网络编程?

网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)

我们只需要满足进程不同即可,即便是同一个主机的不同进程,基于网络来传输数据,也称作网络编程

  • 进程A:编程来获取网络资源
  • 进程B:编程来提供网络资源

3.发送端和接收端

在一次网络数据传输时:
  • 发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
  • 接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。

4.请求和响应

一般来说,获取一个网络资源,涉及到两次网络数据传输:
  • 第一次:请求数据的发送
  • 第二次:响应数据的发送。

 5.客户端和服务端

  • 服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。
  • 客户端获取服务的一方进程,称为客户端。

6.如何进行网络编程(Socket套接字)

1.如何进行网络编程

 

2.TCP与UDP的区别

1.流套接字:使用传输层TCP协议

TCP,即Transmission Control Protocol(传输控制协议),传输层协议
以下为TCP的特点:
  • 有连接(比如打电话接通后双方才可以通信)
  • 可靠传输(若丢包,会有重传机制)
  • 面向字节流(打电话说一个字对方就能听到一个字)
  • 有接收缓冲区,也有发送缓冲区
  • 大小不限(想说多少说多少)
对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。

2.数据报套接字:使用传输层UDP协议

UDP,即User Datagram Protocol(用户数据报协议),传输层协议。
以下为UDP的特点:
  • 无连接(对方有没有开机并不影响)
  • 不可靠传输(丢包就丢了)
  • 面向数据报(发短信一整条发出去对方才可以阅读)
  • 有接收缓冲区,无发送缓冲区
  • 大小受限:一次最多传输64k(短信大小会有限制)
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节

3.举例对比TCP与UDP

7.Java中使用UDP数据报套接字编程

1.类和方法

DatagramSocket API 中DatagramSocket 是UDP Socket ,用于发送和接收UDP数据报

1.DatagramSocket 构造方法

2.DatagramSocket普通方法

 

 3.DatagramPacket API

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

1.DatagramPacket 构造方法

 2.DatagramPacket 方法普通

8.实现一个简单的UDP回显服务器于客户端

服务端步骤:

  1.  定义一个用于服务器端的DatagramSocket
  2. 对外提供服务
  3. 循环接收用户的请求
    1. 创建一个用于接收请求数据的DatagramPacket
    2. 接收请求, 把真实的内容填充到requestPacket
    3. 从requestPacket获取数据
    4. 根据请求获取响应
    5. 把响应封装到DatagramPacket
    6. 发送数据
    7. 打印日志

服务端代码:

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

public class UDPsever {

    private DatagramSocket sever;

    //初始化,端口号
    public UDPsever (int port) throws Exception {
        if (port < 1024 || port > 65535) {
            throw new Exception("端口号必须在1024~65535之间");
        }
        this.sever = new DatagramSocket(port);
    }

    //对外提供服务
    public void start () throws IOException {
        System.out.println("服务端已启动~~");
        while (true) {
            //用户接收请求的DatagramPacket
            DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);
            //接受请求
            sever.receive(requestPacket);
            //从请求中获取并解析数据
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            //根据真实请求获取响应
            String response = processor (request);
            //封装响应
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(StandardCharsets.UTF_8),response.getBytes().length,requestPacket.getSocketAddress());
            //发送数据
            sever.send(responsePacket);
            //打印日志
            System.out.printf("[%s:%d] request: %s, response: %s.\n", requestPacket.getAddress().toString(),
                    requestPacket.getPort(), request, response);
        }
    }

    private String processor(String request) {
        return "小锦鲤 " + request;
    }

    public static void main(String[] args) throws Exception {
        UDPsever sever = new UDPsever(8888);
        sever.start();
    }

}

2.客户端步骤

1.定义一个用于客户端的DatagramSocket
2.定义服务器的IP地址,定义服务器的端口号
3.循环接收用户的输入

1. 把请求内容包装成DatagramPacket
2. 发送数据
3. 接收响应
4. 在receive方法中填充响应数据
5. 解析响应数据
6. 打印日志

客户端代码:

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UDPclient {

    private DatagramSocket client;

    private String severIp;
    private int port;
    private SocketAddress address;

    public UDPclient (String severIp, int port) throws SocketException {
        this.client = new DatagramSocket();
        this.severIp = severIp;
        this.port = port;
        this.address = new InetSocketAddress(severIp, port);
    }

    public void start () throws IOException {
        System.out.println("客户端已启动~~");
        // 循环接收用户的输入
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入请求");
            String request = sc.next();
            // 1. 把请求内容包装成DatagramPacket
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),request.getBytes().length,address);
            //2. 发送数据
            client.send(requestPacket);
            //3. 接收响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);
            //4. 在receive方法中填充响应数据
            client.receive(responsePacket);
            //5. 解析响应数据
            String response = new String(responsePacket.getData(),0,responsePacket.getLength(),"UTF-8");
            //6. 打印日志
            System.out.printf("request:%s, response : %s.\n",request,response);


        }
    }

    public static void main(String[] args) throws IOException {
        UDPclient pclient = new UDPclient("127.0.0.1",8888);
        pclient.start();
    }
}

上述我们只是简单地将原请求返回回去,其实我们还可以使用map通过键值对返回其对应的值

代码如下:

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UDPclient {

    private DatagramSocket client;

    private String severIp;
    private int port;
    private SocketAddress address;

    public UDPclient (String severIp, int port) throws SocketException {
        this.client = new DatagramSocket();
        this.severIp = severIp;
        this.port = port;
        this.address = new InetSocketAddress(severIp, port);
    }

    public void start () throws IOException {
        System.out.println("客户端已启动~~");
        // 循环接收用户的输入
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入请求");
            String request = sc.next();
            // 1. 把请求内容包装成DatagramPacket
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),request.getBytes().length,address);
            //2. 发送数据
            client.send(requestPacket);
            //3. 接收响应
            DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);
            //4. 在receive方法中填充响应数据
            client.receive(responsePacket);
            //5. 解析响应数据
            String response = new String(responsePacket.getData(),0,responsePacket.getLength(),"UTF-8");
            //6. 打印日志
            System.out.printf("request:%s, response : %s.\n",request,response);


        }
    }

    public static void main(String[] args) throws IOException {
        UDPclient pclient = new UDPclient("127.0.0.1",8888);
        pclient.start();
    }
}

结果展示:

 

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

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

相关文章

面了一个测试工程师要求月薪23K,总感觉他藏了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

【前端知识】Cookie, Session,Token和JWT的发展及区别(四)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;四&#xff09; 9. JWT9.1 JWT的背景及定义&#xff08;1&#xff09;JWT的字面理解&#xff08;2&#xff09;JWT与传统Token的区别 9.2 JWT的组成&#xff08;1&#xff09; Header&#xff08;头部&#xff…

【负载均衡式在线OJ】 数据库

文章目录 41.使用Postman进行综合调试42.了解-前端预备52. 添加oj用户到MySQL53. 使用MySQL_Workbench创建表结构54. 测试录题功能55.重新设计oj_model56.编写oj_model具体代码57.MySQL综合测试58.结项与项目扩展思路 41.使用Postman进行综合调试 完善判题功能 先编译再测试 …

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中&#xff0c;在真实的项目中也会有很多产品经理兼任项目经理的职责&#xff0c;这点还是比较常见的&#xff0c;如果说产品或者开发人员考了PMP证书&#xff0c;本身也会让你在找工作的大军中更具有优势&#xff0c;俗话…

一文读懂selenium自动化测试(基于Python)

前言 我们今天来聊聊selenium自动化测试&#xff0c;我们都知道selenium是一款web自动化测试的工具&#xff0c;它应该如何去运用呢?我们接着看下去。 ​1、Selenium简介&#xff1a; 1.1 Selenium&#xff1a; Selenium是一款主要用于Web应用程序自动化测试的工具集合。Sele…

Vue事件

1&#xff0c;回顾js中的事件&#xff1f; 答&#xff1a;标签的状态变化或者被外物改变则称为事件。一般js中的事件都是由浏览器捕捉得到&#xff0c;然后传递给js引擎&#xff0c;浏览器检测到HTML页面中某个标签元素发生了指定的事件&#xff0c;而对应的DOM节点必须去调用回…

Python系列模块之标准库re详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、Python 正则表达式 1.1 re模块常用操作 1.2 re.match 1.3 re.search 1.4 re.findall 1.5 re.compile 函数 1.6 re.sub 检索和替换 1.7 re.split拆分 1.8 实战案例&#xff1a;根据文…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

vs code 配置net 开发环境.并搭配vs相似的解决方案面板

由于在本人在Linux22.04下安装Rider 一直处于卡死系统状态.不得不使用该方式 以下为安装步骤 安装 VS code https://code.visualstudio.com/Download 安装 mono https://www.mono-project.com/download/stable/#download-lin 安装 NET SDK https://learn.microsoft.com/zh…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭&#xff1b;有的品牌通过狂追当下Z世代的喜好&#xff0c;推翻经典设计&#xff1b;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下&#xff0c;羽绒服行业正在经历“地位”洗牌。 目前&…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗&#xff1f; 默认情况下&#xff0c;当您将小部件添加到您的网站时&#xff0c;它们将显示在所有页面上。但是&#xff0c;有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐&#xff08;章节末附pk图&#xff09; 1、国内云测平台 1&#xff09;Testin云测 网址&#xff1a;https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台&#xff0c;为移动应用开发者和测试人员提供一站式的移动应用质…

让数据背后的那些话创造价值 | 数据增长

从行业背景而言&#xff0c;流量红利逐渐消失&#xff0c;野蛮生长的互联网时代接近尾声。传统的烧钱模式、靠体力投放的形式日渐乏力。但是&#xff0c;企业总是要追求增长的。所以在行业大背景下&#xff0c;依靠技术和数据的力量寻求更科学、更高效的方法达成营销目标&#…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会&#xff0c;2023年3月22日于杭州圆满结束&#xff0c;在杭州市人民政府、浙江省经济和信息化厅指导&#xff0c;由杭州市经济和信息化局、杭州市西湖区人民政府主办&#xff0c;中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行开发的过程。config&#xff1a;主要用来存储配置文件&#…

凹函数和凸函数

凹函数英文concave&#xff0c;凸函数英文concave。 在有些参考资料中&#xff0c;凸函数又称为下凹&#xff08;concave down&#xff09;函数&#xff0c;凹函数称为上凹(concave up)函数。 凹函数和凸函数根据判定方法的不同&#xff0c;分为以下两类&#xff1a; 一元函…

虚幻商城模型转MetaHuman

一、导入虚幻商城的模型到UE 1.去虚幻商城下载一个人物模型,这里以SchoolGirl为例 2.导入UE,并找到模型,这里是SkeletalMesh 二、启动MetaHuman插件 1.通过Edit->Plugins启用MetaHuman和MetaHumanSDK插件,这里MetaHuman插件是用于创建MetaHuman的,MetaHumanSDK插件…

会声会影2023最新完整版免费下载

会声会影2023操作简单&#xff0c;功能同样强大&#xff01;会声会影附带上百种特效、滤镜、转场、模板。同时各类专业级视频工具&#xff0c;如调色、遮罩、绿幕抠像、运动追踪、分屏创建器&#xff0c;满足更高标准的视频需求。这款软件上手操作简单易学&#xff0c;就算你在…

C++ 初始模板

模板 void Swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; }void Swap(double* x, double* y) {double tmp *x;*x *y;*y tmp; }void Swap(char* x, char* y) {char tmp *x;*x *y;*y tmp; } 如上述所示&#xff0c;我们在实现函数的时候&#xff0c;有很多函数会像…

第四届“中国法研杯”司法人工智能挑战赛-刑期预测赛道三等奖方案

一、前言 本文将回顾第四届“中国法研杯”司法人工智能挑战赛-刑期预测算法赛道比赛。使用多任务预训练、然后进行微调的形式最终在比赛中取得了三等奖的成绩。 二、任务介绍 主办方在第一届“中国法研杯”比赛上提出了刑期预测任务&#xff0c;本届将针对往届刑期预测准确率…