网络编程(一)UDP编程客户端/服务器代码详细解析

Python 网络编程 TCP/UDP 详细基础 1 基础概念 1.1 Linux Windows 命令行查看网络信息 Linux: ifconfig windows: ipconfig 开/关网卡:sudo ifconfig ###(网卡名) up/down 1.2 IP地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 IP地址即在网络中标识一台. 阅读详情

前言

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这篇博客会解析基于UDP协议来进行网络编程,进行客户端和服务器之间的交互,主要是把客户端和服务器之间交互的流程走一遍,包括发送数据报、读取数据报、将字符串数据转为数据报,读取到数据报转化为字符串
铁汁们可以看上篇“初始网络通信”博客,复习下网络通信的基础知识,初学时对服务器和客户端交互的代码可能会感觉比较抽象,建议多写几次代码,结合api解析和数据传输流程细品下🐵
在这里插入图片描述🎆个人主页:洋不写bug的博客
🎆所属专栏:JavaEE学习
🎆铁汁们对于JavaEE的各种常用核心语法,都可以在上面的JavaEE专栏学习,专栏正在持续更新中🏀,有问题可以写在评论区或者私信我哦~

1,网络编程简介

描述网络通信时传输的数据,可以说数据报/段/包/帧,4种叫法都是网络传输数据的基本单位,在日常工作中,一般是不去区分这四种的区别的,是混着叫的
但是严谨来说,这四种叫法还是有区别的,在不同场景下有不同的叫法(写学术论文时才需要注意,这里铁汁们了解下即可):

  1. 报(datagram):UDP协议
  2. 段(segment):TCP协议
  3. 包(packet):IP协议
  4. 帧(frame):数据链路层的协议



学习网络编程,写的程序是处于应用层上的,程序员主要的工作就是调用系统的api(对应的功能接口),把数据交给传输层,至于传输层到物理层之间的通信逻辑,都是由操作系统/驱动/硬件已经实现好的,不需要程序员关心了

网络编程重点要学习的就是传输层的api,传输层提供的api又称为socket api(网络编程套接字),这个socket的翻译是插槽,应用程序创建 Socket,就相当于在本机上开辟一个通信端点,把程序 “接入” 网络,完成数据收发。

传输层主要用到的协议就是TCP和UDP协议,这两个协议提供了两组socket api,

2,TCP和UDP

TCP和UDP区别如下:

  1. TCP:有连接,可靠传输,面向字节流,全双工
  2. UDP:无连接,不可靠传输,面向数据报,全双工

有连接和无连接的理解,可以类比结婚,结婚的标志是两个人领了结婚证,就相当于建立了连接,两个人通过结婚证保存了对方的关键信息,通过结婚证,就能知道小帅的老婆是小美,小美的老公是小帅

网络上建立的是一种抽象的连接,有无连接就是看双方是否保存了对方的关键信息,TCP双方就会互相保存对方的信息,UDP双方不会保存对方的信息(如果需要保存,还需要在应用层写代码来保存)



这个可靠/不可靠传输,就跟丢包有关,丢包是客观存在的,可靠传输就是在对抗丢包

  • TCP就是尽可能的确保数据能够被对方接收到,属于可靠传输
  • UDP则是把数据包发出去后,就不再管了

注:一些文章中可能会把这个可靠性和安全性混淆了,说TCP传输是安全的,UDP传输是不安全的,因为TCP尽可能确保数据能被对方接收到,这个跟安全性没关系,安全是指数据不容易被黑客截获/破解



UDP传输的是数据报,TCP传输的是字节流,全双工指的是通信双方可以同时发送和接收数据,收发互不干扰

3,UDP编程api

UDP编程首先要创建个DatagramSocket对象,这个对象就代表了操作系统中的socket文件,按照之前的理解,文件就是硬盘的抽象,读写文件时,本质上就是在操作硬盘,但文件在操作系统中是更广义的概念,代表着更多的硬件设备和软件资源

网卡是计算机和网络之间的硬件接口,负责把电脑里的数字信号转换成网线 / Wi‑Fi 能传输的信号,同时接收网络上的数据,转回计算机能识别的数字信号。
网卡硬件的设备也是通过文件来封装的,通过网络发送数据,需要往网卡中写入,通过网络接收数据,需要从网卡中读取,封装网卡的文件,就称为"socket文件"

这个文件是先打开,再读写,最后关闭,跟前面文件IO的一些设定是非常类似的,Java中创建一个DatagramSocket对象,就是在操作系统中打开了一个socket文件(代表网卡),通过这个对象写入数据,就是在通过网卡发送数据;通过这个对象读取数据,就是在通过网卡接收数据



Datagram类中的方法介绍如下(后面写代码时还会解析):

  1. DatagramSocket()
    无参构造方法,创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
  2. DatagramSocket(int port)
    有参构造方法,创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)
  3. void receive(DatagramPacket p)
    从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
  4. void send(DatagramPacket p)
    从此套接字发送数据报包(不会阻塞等待,直接发送)
  5. void close()
    关闭此数据报套接字



UDP协议中,发送和传输的都是数据报,UDP的数据报类就是DatagramPacket,数据报是UDP通信时的基本传输单位
DatagramPacket对象本质上存储的是字节数组,也就是把应用数据编码转换成字节数组,存到DatagramPacket对象中

DatagramPacket类中的方法介绍如下:

  1. DatagramPacket(byte[] buf, int length)
    构造一个 DatagramPacket 以用来接收数据报,接收的数据保存在字节数组(第一个参数 buf)中,接收指定长度(第二个参数 length)

  2. DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
    构造一个 DatagramPacket 以用来发送数据报,发送的数据为字节数组(第一个参数 buf)中,从 0 到指定长度(第二个参数 length)。address 指定目的主机的 IP 和端口号

  3. InetAddress getAddress()
    从接收的数据报中,获取发送端主机 IP 地址;或从发送的数据报中,获取接收端主机 IP 地址

  4. int getPort()
    从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号

  5. byte[] getData()
    获取数据报中的数据



网络通信的基本流程如下图,客户端主动发起通信,服务器被动的接收通信,通常是一个服务器要服务多个客户端的,因为是基础部分,一会写代码就先跑通一台服务器,一个客户端的情况

在这里插入图片描述

客户端和服务器要执行的任务和执行顺序如下图:

在这里插入图片描述

4,UDP回显服务器/客户端

1,服务器

我们就用UDP协议做个简单的“回显服务器”(EchoServer),回显服务器省略了服务器根据请求计算响应的部分,把客户端发送的数据再原样返回给客户端



首先写下服务器的代码,定义个DatagramSocket的成员变量,写个构造方法,里面传入port,也就是端口号,创建DatagramSocket对象,创建的时候传入端口号进行绑定,此时这个socket就关联到了一个端口号

端口号是上篇博客中提到的五元组中的一部分,想发送信息,就要知道目标端口号和源端口号
例如服务器在启动时,绑定一个端口号6060,客户端在启动时绑定一个端口号9090,客户端在给服务器发送请求时,源端口是9090,目标端口是6060;
服务器给客户端发送响应时,源端口是6060,目标端口是9090

端口号在网络协议中,是用两个字节表示的无符号整数,范围就是0 - 65535,0 - 1024这个范围的端口号,称为“知名端口号”,系统预留给了一些知名协议的服务器来使用,因此铁汁们绑定端口号的时候就不要绑定这个范围的

package network;

import java.net.DatagramSocket;
import java.net.SocketException;

public class EchoServer{
    private DatagramSocket socket;

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



规定一个端口在同一时刻,只能被一个进程绑定,假如steam进程和B站进程绑定了同一个端口号,那传输回来的游戏数据也会给B站应用,这样就乱套了,因此如果尝试给socket绑定已占用的端口号,这里就会抛出异常

铁汁们绑定端口号时,如果抛出异常了,换个端口号绑定即可
也可以打开命令行工具,输入netstat -an,查看当前的端口占用情况,本地地址中冒号后面的部分就是端口号,6万多个端口号,这里也没占用多少,因此绑定时重复的概率是很小的

在这里插入图片描述



再写个void类型的start方法,start方法就是启动服务器,完成相应的业务逻辑,服务器的主要逻辑有三个:

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应写回到客户端中

这三个步骤应该写到while(true)中,因为服务器是一直开启的,等待客户端访问,代码逻辑如下:

  1. 读取请求需要调用socket的receive方法,receive方法中要传入一个DatagramPacket对象,把读取到的结果存储到数据报对象中的字节数组中(当没有接收到数据报时,receive就会阻塞等待,类似于阻塞队列)
    因此要先创建个数据报对象reqPacket,铁汁们可以看下前面api中数据报对象的构造方法,就是传入一个字节数组,再传入数组的接收长度
  2. socket读取完成后,信息存到了reqPacket对象中的字节数组,要把这些信息转为字符串的形式,通过getData方法拿到reqPacket中的字节数组,用getLength获取数据包中的有效数据的长度,调用String方法的字节数组构造函数即可
  3. 把数据报信息转化成字符串的类型后,把字符串传到process方法中,process方法进行计算,返回要发送给客户端的字符串(这里因为是回显服务器,所以process中返回的还是原内容)
  4. 从process方法中接收到返回的字符串后,要把这个字符串再转化为数据报类型,创建个数据报对象respPacket(response),用于返回给客户端,用DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)这个构造方法,将字符串转化为字符数组
    offset表示从哪个位置开始,传入0,length表示从 offset 位置开始,一共取多少个字节用来组成这个数据报,address就是目的主机的IP和端口号,就调用前面reqPacket对象的getSocketAddress方法,来获取主机IP和端口号数据(因为操作系统在解析IP报头和UDP报头时,会把信息存到数据报对象中)
  5. 在末尾再写个打印日志,打印ip地址,端口号,以及请求字符串和返回的字符串
    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            //1.读取请求并解析
            DatagramPacket reqPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(reqPacket);
            String request = new String(reqPacket.getData(),0,reqPacket.getLength());
            //2.根据请求计算响应
            String response = process(request);
            //3.把响应写回到客户端
            DatagramPacket respPacket = new DatagramPacket(response.getBytes(),response.getBytes().length,reqPacket.getSocketAddress());
            socket.send(respPacket);
            System.out.printf("[%s:%d] req:%s, resp:%s\n",reqPacket.getAddress(),reqPacket.getPort(),request,response);
        }
    }

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

2,客户端

首先写下成员变量和构造方法:

  1. 在客户端中还需要定义serveIp和servePort两个成员变量,因为客户端是主动发送数据的,要知道数据发送给谁,也就是要知道服务器的IP和端口号。而服务器发送数据的时候,就可以直接通过收到的请求,知道数据是要发送给谁
  2. 另外,创建socket对象时选用无参的构造方法,这样系统会为socket自动分配一个空闲的端口号,服务器不能这样搞,因为服务器必须有个确定的端口号,因为客户端访问时要根据IP和端口号选择选择访问哪个服务器
package network;

import java.net.DatagramSocket;
import java.net.SocketException;

public class EchoClient {

    private DatagramSocket socket;
    private String serveIp;
    private String servePort;

    public EchoClient(String serveIp, String servePort) throws SocketException {
        this.serveIp = serveIp;
        this.servePort = servePort;
        socket = new DatagramSocket();
    }
}



铁汁们思考个问题,如果在创建socket对象时,不让系统随机分配空闲端口号,而是自己传入一个固定的空闲端口号,可以吗?

这样做在自己计算机上测试测试客户端和服务器代码是没有一点问题的
但客户端代码最终是在用户的计算机上运行的,如果传入一个固定的端口号,这个端口号只是当前在程序员的计算机上是空闲的,在用户的计算机就不一定了,用户的计算机上会运行什么样的程序,占用什么样的端口,程序员是预知不到的,一旦这个端口已经在用户的计算机上被占用了,那客户端就运行失败,就属于是一个很严重的bug



start方法逻辑如下:

  1. 首先从控制台以字符串的形式读取用户输入的内容
  2. 再构建数据报,数据报中传入四个参数:字符串转成的字节数组、有效数据长度,目的IP、目的端口号,传目的IP的时候不能直接传serveIp,要转化为InetAddress对象,接着把内容发送给服务器
  3. 再构建个数据报respPacket,再用receive方法读取服务器的响应,把数据报转化为字符串,再打印字符串
    public void start() throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("客户端启动!");
        while(true){
            //1.冲控制台中读取用户输入的内容
            System.out.printf(">");
            String request = scanner.next();

            //2.构造数据报内容,里面包括发送的内容,目的IP和目的端口号
            DatagramPacket reqPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serveIp),servePort);
            socket.send(reqPacket);

            //3.读取服务器的响应
            DatagramPacket respPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(respPacket);
            String response = new String(respPacket.getData(),0,respPacket.getLength());

            //4.把响应显示到控制台
            System.out.println(response);
        }
    }

3,测试

到这里服务器类和客户端类已经写完了,先在服务器类中写个main方法,启动一下服务器,启动后不要终止这个程序

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

在这里插入图片描述


再在客户端类中写个main方法,启动客户端,IP地址传入的是127.0.0.1,这个地址是回环地址,表示访问自己的主机,因为现在服务器和客户端都在一个主机上,所以这样写
写服务器和客户端代码,肯定要先在自己的机子上跑通代码,IP就是传入
127.0.0.1,表示客户端访问自己主机上的服务器

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

在这里插入图片描述



再到服务器控制台看下,在服务器的start方法中加了打印,每次处理时都会打印发送请求的客户端的IP、端口号、客户端发送的字符串、服务器返回的字符串

在这里插入图片描述



这里如果在IDEA上运行一个服务器,能不能让其他同学通过IP地址和服务器端口号来访问这个服务器,实现跨主机通信呢?
在同一个局域网中是可以的(也就是两个人的计算机连着同一个路由器的WiFi)
如果不在同一个局域网中,是访问不了的,因为我们计算机的IP是内网的私有IP,路由器外面互联网是不认这个地址的,想要实现真正的跨主机访问,就可以把服务器程序放到“云服务器上”(这部分涉及到程序打包、云服务器使用、防火墙,属于是JavaEE进阶的内容了,会在后面的博客中解析🐵)

4,UDP翻译服务器

写个简易的翻译服务器,客户端输入英语单词,服务器返回汉语翻译,服务器就叫做DictServer(dict是字典的意思)

除了对客户端请求的响应变了(process方法变了),其他逻辑跟回显服务器的逻辑基本上一样:创建socket、读取数据报、数据报转化字符串、响应后的字符串转化为数据报、数据报再发送回客户端

写的简单一点,就搞个HashMap,里面存储一些单词和汉语的键值对,当HashMap足够大时,就能完成单词的翻译,我们写代码时随便添加一些,意思一下即可:

package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;

public class DictServer{
    private DatagramSocket socket;
    private Map<String,String> dict = new HashMap<>();

    public DictServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
        dict.put("cat", "小猫");
        dict.put("dog", "小狗");
        dict.put("pig", "小猪");
        dict.put("bird", "小鸟");
        dict.put("sheep", "小羊");
        dict.put("cow", "小牛");
        dict.put("chicken", "小鸡");
        dict.put("rabbit", "小兔子");
        dict.put("fish", "小鱼");
        dict.put("tiger", "老虎");
        dict.put("lion", "狮子");
        dict.put("wolf", "狼");
        dict.put("monkey", "猴子");
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            //1.读取请求并解析
            DatagramPacket reqPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(reqPacket);
            String request = new String(reqPacket.getData(),0,reqPacket.getLength());
            //2.根据请求计算响应
            String response = process(request);
            //3.把响应写回到客户端
            DatagramPacket respPacket = new DatagramPacket(response.getBytes(),response.getBytes().length,reqPacket.getSocketAddress());
            socket.send(respPacket);
            System.out.printf("[%s:%d] req:%s, resp:%s\n",reqPacket.getAddress(),reqPacket.getPort(),request,response);
        }
    }

    public String process(String request){
        return dict.getOrDefault(request,"未找到该单词的翻译");
    }

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




启动翻译服务器,直接用前面的回显客户端来连接服务器即可

在这里插入图片描述

在这里插入图片描述

结语💕💕

  • 这里主要是练习服务器和客户端的交互,服务器的响应逻辑是比较简单的,实际服务器是比较复杂的,大型成熟服务器整体代码量能达到百万行级别,具体如何处理还是根据软件的具体需求
  • 下篇博客会解析用TCP协议进行网络编程

以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

简要分析网络编程——UDP编程 UDP编程 阅读详情

相关推荐

Java网络编程:UDP服务器与客户端实现详解

UDP(User Datagram Protocol)协议,即用户数据报协议,是一种无连接的、不可靠的网络传输协议。与TCP协议相比,UDP以其简单、高效的特点,在某些特定场景下非常适用,如视频流、在线游戏和语音通话等。尽管UDP不保证数据的完整性和顺序性,它却能减少数据传输的延迟,这对需要实时通信的应用至关重要。Java作为一门跨平台、面向对象的编程语言,其在网络编程方面提供了丰富的API来支持开发者进行网络通信的开发。Java网络编程模型的灵活性与多线程支持,使其成为开发网络应用的首选语言之一。

weixin_42174098的博客 876

【Java网络编程】使用Tcp和Udp实现一个小型的回声客户端服务器程序

利用Java实现网络编程,编写一个小型的Udp和Tcp的回声客户端服务器程序。附带代码和详细的代码解释

yican2580的博客 2285

Android PackageManagerService 总结(一)应用市场下载安装apk流程

前言: 本篇文章是对系统包安装流程的总结,基于Android12 上 com.android.packageinstaller 源码的分析,第三方应用商城(华为商城,小米商城,应用宝,豌豆荚,酷安等)下载安装应 用,在普通安装和静默安装app两种方式下,对代码流程的梳理和讲解。 触发安装: 当你在商城界面中点击安装按钮,应用会自动下载,下载完成后就会调起系统安装应用的界面,此种触发方式一般是通过Intent 隐式调用的,我们先阅读如下代码: ......

u012514113的专栏 1万+

Java 网络编程(一)—— UDP数据报套接字编程

介绍Java中的UDP数据报套接字的使用

熵减玩家 6701

OpenCV安装配置教程VS2022(超级顺利)

博主最开始没打算写这篇博客,只是想简单的在网上找一下最新版的OpenCV的安装配置教程,适用于VS2022的,但是我搜了一早上,也没搜到一个能让我成功安装配置的,看了很多很多文章,根本就没有几篇有用的。所以没办法了,只能自己研究了,于是就整理了这篇博客,希望能帮到和我一样的人,这就是博主一直信奉的利他精神!

weixin_47367099的博客 5万+

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6047

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

Socket套接字,是由系统提供的用于网络编程的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 前面说过,要想进行网络编程,需要使用的系统API,本质上是由传输层提供的。 传输层涉及到的主要协议有两个: 流套接字:TCP(传输控制协议) 数据报套接字:UDP(用户数据报协议)

StuLearn-LJC的博客 3086

用友U8库龄分析避坑指南:物料出入库日期计算的5个常见错误

本文深入剖析了在用友U8系统中进行库龄分析时,物料出入库日期计算的五个常见陷阱。从数据源选择、业务类型过滤、计价方式逻辑、期初数据处理到查询性能优化,逐一解析错误根源并提供避坑指南,帮助企业获得准确的库龄数据,有效管理库存与资金风险。

weixin_29209801的博客 454

【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

保护小周ღ的博客 4816

(实测可用)STM32L431RCT6开发板-实验1 跑马灯实验

一、开发板平台简介: 1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 3166

解决Visual C++2008安装失败,error 1935

重装系统后Visual C++没了,其他都能装上但VC2008会报这个error 1935。鉴于我把网上所有的解决方法排了一遍错,我也不知道是哪一步起效,所以就都放上来了。特别注意:报error 1935的错误原因可能不尽相同,比如我的报错开头为An error occurred,结尾为HRESULT:0x80070005。80070005 拒绝访问通常是权限问题,安装Visual C++无法写入文件夹或注册表(直接跳转第7步)

weixin_44427808的博客 1万+

网络编程(TCP、UDP)

网络编程(1)网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。(2)在程序员层面上,即要写一个应用程序通过调用传输层提供的API实现网络通信。

wuweixiaoyue的博客 2871

大数据实时+离线项目架构----智慧物流大数据平台(超流行框架!)

智慧物流大数据平台 文章目录智慧物流大数据平台一、项目背景二、逻辑架构三、解决方案技术亮点:数据流转四、项目的技术选型4.1流式处理平台4.2 分布式计算平台4.3 海量数据存储框架软件版本总结 一、项目背景 本项目基于一家大型物流公司研发的智慧物流大数据平台。该物流公司是国内综合性快递、物流服务商,并在全国各地都有覆盖的网点。经过多年的积累、经营以及布局,拥有大规模的客户群,日订单达上千万。如此规模的业务数据量,传统的数据处理技术已经不能满足企业的经营分析需求。公司需要基于大数据技术构建数据中心,从而挖

weixin_48143996的博客 6428

Java网络编程之UDP与TCP的网络编程

本文将介绍java中的网络编程,常见的网络编程方式有两种,一种是UDP,另外一种是TCP,其中UDP的服务器与客户端之间不需要建立连接就能进行通信,而TCP需要先建立服务器与客户端之间的连接才能进行通信,此外TCP与UDP不能进行通信。

未见花闻的博客 2634

【系统架构设计师】2026年上半年真题论文:论高并发系统的设计与实践

本文围绕高并发系统架构设计展开,重点论述了电商秒杀系统的实战经验。文章采用"痛点-解决方案-效果"的逻辑结构,从缓存设计、异步处理、限流降级、数据库优化等6个维度详细阐述了应对高并发的技术策略。其中,重点介绍了多级缓存体系、基于消息队列的异步处理机制和微服务拆分实践,并辅以实际案例说明如何解决超卖、缓存雪崩等典型问题。全文强调高并发设计需要系统性思维,通过空间换时间、异步换吞吐、横向换能力等原则,最终实现系统吞吐量从500TPS提升至20000TPS的性能突破。

数据知道的博客 1154

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[网络编程]TCP和UDP的比较 及 通过java用UDP实现网络编程

前面我们知道, UDP是无连接的, 所以本身并没有存储对方的ip和端口信息, 但是上述我们用来接收数据的DatagramPacket中, 存放了客户端的ip和接口, 所以我们可以通过getSocketAddress()方法来获取到。我们现在只是进行一个简单的实现, 服务器收到客户端请求后, 无需做什么, 客户端请求啥, 直接响应啥, 这种程序, 就叫做"回显"(Echo)系统中的socket, 可以理解成是一种"文件", socket文件, 可以视为是"网卡"这种硬件设备的抽象表现形式。

m0_73992740的博客 1212

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

网络编程——UDP

Linux下的UDP网络编程通过 socket()、sendto() 和 recvfrom() 等系统调用实现数据发送和接收。接收数据:服务器通过 recvfrom() 接收客户端发送的数据,recvfrom() 可以返回发送数据的客户端地址信息。创建套接字:使用 socket() 创建UDP套接字,指定地址族 AF_INET 和套接字类型 SOCK_DGRAM。无连接特性:UDP是无连接的,这意味着客户端和服务器不需要建立连接,只要有目标地址和端口,数据就可以发送。1.使用 sendto() 发送数据。

WWWWwwwBJ的博客 2064

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

网络编程套接字之UDP

因为我们的服务器在进行网络通信中,是属于比较被动的一方,如果我们使用的是系统随机进行分配的端口号,那么我们的客户端就不知道服务器端口号是多少,也就无法进行通信了。我们在构造DatagramPacket的时候,需要将ip和端口号都传入,此处需要传入的IP是32位的整数形式,但我们这里的ip是字符串,所以需要使用InetAddress.getByName进行转换,然后进行发送。我们的receive方法参数传入的是一个空的对象,receive方法内部会对这个对象进行填充,从而构造出结果数据,我们称这样的参数为。

buhuisuanfa的博客 2263

网络编程 —— TCP 和 UDP 编程详解

网络编程 —— TCP 和 UDP 编程详解 网络编程主要函数介绍 TCP和 UDP 原上的区别TCP 编程 UDP 编程

wei_Embedded_z的博客 2739

网络编程——Socket 编程详解(TCP / UDP)

网络编程——Socket 编程详解(TCP / UDP)——从入门到精通

zxjiaya的博客 1931

网络编程(一)TCP编程和UDP编程

计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。那什么是互联网呢?互联网是网络的网络(internet),即把很多计算机网络连接起来,形成一个全球统一的互联网。对某个特定的计算机网络来说,它可能使用网络协议ABC,而另一个计算机网络可能使用网络协议XYZ。如果计算机网络各自的通讯协议不统一,就没法把不同的网络连接起来形成互联网。因此,为了把计算机网络接入互联网,就必须使用TCP/IP协议。TCP/IP。

weixin_64685917的博客 1310

Java【网络编程1】使用 UDP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

详细介绍Socket套接字的使用方式, DatagramSocket类, DatagramPacket类, 手把手教会你基于 UDP 协议进行最简单的客户端服务器通信!

yzhcjl_的博客 2418

网络编程(TCP/UDP)

网络编程指的是,同一个主机但是不同进程之间通信也是网络编程,但是我们主要编程对象是不同主机至今啊的通信。网络编程实际上就是把传输层和应用层进行封装,然后利用java提供的api进行通过,代码的形式交给传输层然后进行通信。

syx050403的博客 1728

C/C++ Linux网络编程2 - Socket编程与简单UDP服务器客户端

摘要:本文介绍了Linux下UDP网络编程的基础知识,重点讲解了Socket编程API和结构体的使用方法。文章详细说明了sockaddr、sockaddr_in和sockaddr_un三种结构体的区别及应用场景,并通过C++类封装实现了UDP服务端和客户端的完整代码。服务端需要绑定IP和端口,使用recvfrom接收数据;客户端则通过sendto发送数据,无需显式绑定端口。最后提供了本地回环地址127.0.0.1的测试方法,展示了完整的通信流程。

yzc的博客 1030

Linux 网络编程(四)——基于UDP的服务器端/客户端

4 基于UDP的服务器端/客户端 4.1 UDP套接字的特点 4.2 UDP协议适用场景 4.3 基于UDP数的I/O函数 4.4 基于UDP的回声服务器端/客户端 4.5 UDP的数据传输特性 4.6 已连接UDP套接字与未连接UDP套接字(可略过)

m0_60875396的博客 761

TCP/UDP网络编程

快速学会Java代码实现简单的网络编程

m0_62404808的博客 2783
上一篇: 初识网络通信,网络发展背景,TCP/IP五层模型简介
下一篇: 网络编程(二)TCP回显服务器与客户端通信详解
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值