网络编程(IP、端口、协议、UDP、TCP)【详解】

news2024/11/18 21:50:48

目录

1.什么是网络编程?

2.基本的通信架构

3.网络通信三要素

4.UDP通信-快速入门

5.UDP通信-多发多收

6.TCP通信-快速入门     

7.TCP通信-多发多收   

8.TCP通信-同时接收多个客户端

9.TCP通信-综合案例

1.什么是网络编程?

        网络编程是可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术

2.基本的通信架构

        CS架构:Client客户端/Server服务端

        BS架构:Browser浏览器/Server服务端

        无论是CS架构,还是BS架构的软件都必须依赖网络编程

3.网络通信三要素

        1.IP地址

                IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标识,可以用来定位网络上的设备。

                IP地址有两种形式:

                        IPv4:

                                32位,4个字节

                                点分十进制: 192.168.1.66

                        IPv6:

                                128位

                                冒分十六进制: 2001:0db8:0000:0023:0008:0800:200c:417a

                IP域名: 网址

                公网IP, 内网IP:

                        公网IP:是可以连接互联网的IP地址;内网IP:也叫局域网IP,只能组织机构内部使用。                

                        内网IP:192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。

                特殊IP地址:127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。

                IP常用命令:

                        ipconfig :查看本机IP地址

                        ping IP地址:检查网络是否连通

                Java中IP地址的表示:

                        InetAddress

  

package com.itheima.day13.teacher.demo02_ip;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * IP:用于在一个网络里,找到某个计算机设备。一般使用IPv4,比如:192.168.29.33
 * 域名:因为IP比较难记,所以有了域名系统,更方便记忆
 *      IP和域名的关系,类似于  手机通讯录里  手机号和姓名备注的关系
 *      百度的ip:110.242.68.4
 *      百度的域名:www.baidu.com
 * IP地址对象:InetAddress
 *
 */
public class DemoInetAddress {
    public static void main(String[] args) throws IOException {
        //获取本机ip信息
        InetAddress local = InetAddress.getLocalHost();
        String localIp = local.getHostAddress();
        System.out.println("本机ip = " + localIp);
        String localName = local.getHostName();
        System.out.println("本机名 = " + localName);

        //获取指定ip或指定域名的信息
        // InetAddress baidu = InetAddress.getByName("www.baidu.com");
        InetAddress baidu = InetAddress.getByName("110.242.68.4");
        String baiduName = baidu.getHostName();
        System.out.println("baiduName = " + baiduName);
        String baiduIp = baidu.getHostAddress();
        System.out.println("baiduIp = " + baiduIp);

        //测试指定域名的网络是否畅通:200ms之内能否ping通百度
        boolean reachable = baidu.isReachable(200);
        System.out.println("reachable = " + reachable);
    }
}

        2.端口号

                标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535

                分类:

                        周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)                 

                        注册端口:1024~49151,分配给用户进程或某些应用程序

                        动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配

                注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

        3.协议

                1.网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。

                2.开放式网络互联标准

                        OSI网络参考模型:全球网络互联标准

                        TCP/IP网络模型:事实上的国际标准

                

                3.传输层的2个通信协议       

                        UDP:用户数据报协议

                        特点:

                                无连接、不可靠通信,通信效率高

                                不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。

                                发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的 。

                        应用场景:语音通话、视频直播

                        TCP:传输控制协议 

                        特点:

                                面向连接、可靠通信

                                要保证在不可靠的信道上实现可靠的传输

                        TCP主要有三个步骤实现可靠传输:

                                三次握手建立可靠连接:目的确定通信双方,收发消息都是正常无问题的!(全双工)

                                传输数据进行确认:目的保证传输数据的可靠性

                                四次挥手断开连接:目的确保双方数据的收发都已经完成!

                        应用场景:网页、文件下载、支付

4.UDP通信-快速入门

        Java提供了一个java.net.DatagramSocket类来实现UDP通信。

        构造器、方法:

        

        客户端实现步骤:

                创建DatagramSocket对象(客户端对象)​​​​​

                创建DatagramPacket对象封装需要发送的数据(数据包对象)

                使用DatagramSocket对象的send方法,传入DatagramPacket对象

                释放资源

        服务端实现步骤​​ 

                创建DatagramSocket对象并指定端口(服务端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法,传入DatagramPacket对象

                释放资源

package com.itheima.day13.teacher.demo01_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 */
public class Sender {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法
        DatagramSocket ds = new DatagramSocket();

        //2. 准备数据包
        byte[] data = "hello".getBytes();
        DatagramPacket packet =
           new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);

        //3. 把数据包里的数据发送出去
        ds.send(packet);

        //4. 释放资源
        ds.close();
    }
}


----------------
package com.itheima.day13.teacher.demo01_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 */
public class Receiver {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象,并监听7788端口
        DatagramSocket ds = new DatagramSocket(7788);

        //2. 准备数据包。用于存储 接收到的数据。UDP的数据包64K
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        //3. 接收数据。接收到的数据会被放到packet对象里
        ds.receive(packet);

        //4. 把接收到的数据打印出来
        String str =
           new String(packet.getData(), packet.getOffset(), packet.getLength());
        System.out.println("str = " + str);

        //5. 释放资源
        ds.close();
    }
}

        

5.UDP通信-多发多收

        客户端实现步骤:

                创建DatagramSocket对象(发送端对象)

                使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序

                如果用户输入的不是exit, 把数据封装成DatagramPacket

                使用DatagramSocket对象的send方法将数据包对象进行发送

                释放资源

        服务端实现步骤:

                创建DatagramSocket对象并指定端口(接收端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法传入DatagramPacket对象

                使用while死循环不断的进行第3步

        

package com.itheima.day13.teacher.demo03_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * 1. 发送的消息内容,由用户进行输入:用Scanner
 *      Scanner scanner = new Scanner(System.in);
 *      String line = scanner.nextLine();
 * 2. 可以多次发送消息,进行持续通信
 *      发送者持续多次发送
 *      如果用户输入的是“byebye”,就结束循环
 */
public class Sender {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法
        DatagramSocket ds = new DatagramSocket();

        //2. 准备一个扫描器,用于读取用户的输入
        Scanner scanner = new Scanner(System.in);

        //3. 持续通信:不断读取用户的输入,把内容发送出去
        while (true) {
            //读取用户输入的内容
            String line = scanner.nextLine();
            //封装到数据包里
            byte[] data = line.getBytes();
            DatagramPacket packet =
                    new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);
            //把数据包里的数据发送出去
            ds.send(packet);
            //如果用户输入的是byebye,就结束循环
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        ds.close();
    }
}


---------------------
package com.itheima.day13.teacher.demo03_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Receiver {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象,并监听7788端口
        DatagramSocket ds = new DatagramSocket(7788);

        //2. 准备数据包。用于存储 接收到的数据。UDP的数据包64K
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        //3. 持续通信:不断的接收数据并打印出来
        while (true) {
            //4. 接收数据。接收到的数据会被放到packet对象里
            ds.receive(packet);

            //5. 把接收到的数据打印出来
            String str =
                    new String(packet.getData(), packet.getOffset(), packet.getLength());

            System.out.println(packet.getSocketAddress() +"发送了: " + str);
        }

        //5. 释放资源
        // ds.close();
    }
}

6.TCP通信-快速入门     

        1.Java提供了一个java.net.Socket类来实现TCP通信。

                2.客户端实现步骤

                创建客户端的Socket对象,请求与服务端的连接。           

                使用socket对象调用getOutputStream()方法得到字节输出流。

                使用字节输出流完成数据的发送。

                释放资源:关闭socket管道。

        3.服务端实现步骤

                创建ServerSocket对象,注册服务端端口。

                调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。

                通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。

                释放资源:关闭socket管道

package com.itheima.day13.teacher.demo04_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        //2. 通过Socket,把数据发出去到服务端
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("hello");

        //3. 通过Socket,接收服务端返回的数据
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String answer = dis.readUTF();
        System.out.println("收到服务端返回结果:" + answer);

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}

----------------------
package com.itheima.day13.teacher.demo04_tcp;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
        Socket socket = serverSocket.accept();

        //3. 通过Socket,接收客户端发过来的数据
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String data = dis.readUTF();
        System.out.println("接收到客户端发来的数据:" + data);

        //4. 通过Socket,给客户端返回数据
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("hi");

        //5. 释放资源
        dos.close();
        dis.close();
        socket.close();
        serverSocket.close();
    }
}

7.TCP通信-多发多收   

        客户端使用死循环,让用户不断输入消息。

        服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息。

package com.itheima.day13.teacher.demo05_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * 1. 客户端给服务端发送的内容:由用户输入
 * 2. 实现客户端和服务端的持续通信
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        Scanner scanner = new Scanner(System.in);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        while (true) {
            //2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去
            String line = scanner.nextLine();
            dos.writeUTF(line);

            //3. 通过Socket,接收服务端返回的数据
            String answer = dis.readUTF();
            System.out.println("收到服务端返回结果:" + answer);

            //如果用户输入的内容是byebye,就结束
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}


-----------------
package com.itheima.day13.teacher.demo05_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
        Socket socket = serverSocket.accept();

        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        while (true) {
            //3. 通过Socket,接收客户端发过来的数据
            String data = dis.readUTF();
            System.out.println("接收到客户端发来的数据:" + data);

            //4. 通过Socket,给客户端返回数据
            dos.writeUTF("hi");

            if ("byebye".equals(data)) {
                break;
            }
        }

        //5. 释放资源
        dos.close();
        dis.close();
        socket.close();
        serverSocket.close();
    }
}

8.TCP通信-同时接收多个客户端

        主线程定义了循环负责接收客户端Socket管道连接 

        每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 */
public class ServerWorkerRunnable implements Runnable{
    private Socket socket;

    public ServerWorkerRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            while (true) {
                //通过Socket,接收客户端发过来的数据。也是阻塞方法,即:如果当前socket里没有数据可读取,就阻塞
                String data = dis.readUTF();
                System.out.println("接收到客户端发来的数据:" + data);
                //通过Socket,给客户端返回数据
                dos.writeUTF("hi");

                if ("byebye".equals(data)) {
                    break;
                }
            }
            //释放资源
            dos.close();
            dis.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("连接已断开");
        }
    }
}


--------------------
package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 死循环:不断尝试接受客户端的连接。有几个客户端连接进来,就接受几个连接
        while (true) {
            //3. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
            Socket socket = serverSocket.accept();

            //4. 创建一个线程,由这个新线程专门负责它的通信。线程本身是异步的
            new Thread(new ServerWorkerRunnable(socket)).start();
        }

        // serverSocket.close();
    }
}


----------------
package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * 1. 客户端给服务端发送的内容:由用户输入
 * 2. 实现客户端和服务端的持续通信
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        Scanner scanner = new Scanner(System.in);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        while (true) {
            //2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去
            String line = scanner.nextLine();
            dos.writeUTF(line);

            //3. 通过Socket,接收服务端返回的数据
            String answer = dis.readUTF();
            System.out.println("收到服务端返回结果:" + answer);

            //如果用户输入的内容是byebye,就结束
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}

9.TCP通信-综合案例

        1.即时通信-群聊

                是指一个客户端把消息发出去,其他在线的全部客户端都可以收到消息。

                需要用到端口转发的设计思想。

                        服务端需要把在线的Socket管道存储起来,一旦收到一个消息要推送给其他管道。

        2.实现一个简易版的BS架构 

                BS架构的基本原理

        

package com.itheima.day13.teacher.demo07_tcp_tomcat;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 */
public class TomcatWorkerRunnable implements Runnable {
    private Socket socket;

    public TomcatWorkerRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // while (true) {
        try {
            //如果想要接收客户端提交过来的数据
            // InputStream is = socket.getInputStream();
            // is.read();


            //直接给客户端返回结果
            OutputStream os = socket.getOutputStream();
            os.write("HTTP/1.1 200\r\n".getBytes());
            os.write("Content-Type: text/html;charset=UTF-8\r\n".getBytes());
            os.write("\r\n".getBytes());
            os.write("<h1>Hello World!!!</h1>".getBytes());
            os.write("<a href='http://www.baidu.com'>百度</a>".getBytes());

            //必须给浏览器返回一个结束标志,否则浏览器会一直转圈
            socket.shutdownOutput();
        } catch (IOException e) {
            System.out.println("断开连接");
        }
        // }
    }
}


----------------------
package com.itheima.day13.teacher.demo07_tcp_tomcat;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 */
public class TomcatServer {
    public static void main(String[] args) throws IOException {
        //1. 监听8080端口。浏览器访问地址的格式 http://ip地址:8080
        ServerSocket serverSocket = new ServerSocket(8080);

        //2. 死循环
        while (true) {
            //3. 不断尝试接受客户端的连接,得到Socket
            Socket socket = serverSocket.accept();
            //4. 把socket交给一个新线程进行处理
            new Thread(new TomcatWorkerRunnable(socket)).start();
        }
    }
}

        

        

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

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

相关文章

Tomcat负载均衡、动静分离

目录 引言 实验图解 1.实验环境搭建 2.部署Nginx服务器及配置静态页面Web服务 3.部署Tomcat服务及配置动态页面Web服务 4.实验验收 动态页面 静态页面 引言 tomcat服务既可以处理动态页面&#xff0c;也可以处理静态页面&#xff1b;但其处理静态页面的速度远远不如…

【解决方案】ArcGIS Engine二次开发时,运行后出现“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain...”

我们在做ArcGIS Engine二次开发时&#xff0c;特别是新手&#xff0c;安装好了开发环境&#xff0c;满怀信心的准备将按照教程搭建好的框架在Visual Studio中进行运行。点击运行后&#xff0c;却出现了“正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化…

猫耳语音下载(mediadown)

猫耳语音下载(mediadown) 一、介绍 猫耳语音下载,能够帮助你下载猫耳音频节目。如果你是会员,它还能帮你下载会员节目。 二、下载地址 下载:猫耳语音下载(mediadown) 百度网盘下载:猫耳语音下载(mediadown) 三、安装教程 将下载的文件解压到D:\xibinhui,D:\Pr…

数据结构 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

服务器硬件基础知识

1. 服务器分类 服务器分类 服务器的分类没有一个统一的标准。 从多个多个维度来看服务器的分类可以加深我们对各种服务器的认识。 N.B. CISC: complex instruction set computing 复杂指令集计算 RISC: reduced instruction set computer 精简指令集计算 EPIC: explicitly p…

flurl升级之后没有FlurlNewtonsoftJsonSerializer

新建NewtonsoftJsonSerializer.cs /// <summary> /// ISerializer implementation based on Newtonsoft.Json. /// Default serializer used in calls to GetJsonAsync, PostJsonAsync, etc. /// </summary> public class NewtonsoftJsonSerializer : IJsonSerial…

Project_Euler-45 题解

Project_Euler-45 题解 题目 思路 非常简单&#xff0c;枚举六边形数字&#xff0c;然后判断他们是不是三角形和五边形数&#xff0c;如果是&#xff0c;那么输出。 代码 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.…

【详识JAVA语言】逻辑控制

概述 我的曾经&#xff1a; 早上8:00起床--->洗漱--->吃早饭--->上课--->吃午饭--->上课--->运动--->吃完饭--->玩手机--->睡觉 每天的生活貌似都是这么规律&#xff0c;顺序的做着每件事&#xff0c;前途一片渺茫~~~ 直到有一天&#xff1a; 我…

[Java 探索者之路] 一个大厂都在用的分布式任务调度平台

分布式任务调度平台是一种能够在分布式计算环境中调度和管理任务的系统&#xff0c;在此环境下&#xff0c;各个任务可以在独立的节点上运行。它有助于提升资源利用率&#xff0c;增强系统扩展性以及提高系统对错误的容忍度。 文章目录 1. 分布式任务调度平台1. 基本概念1.1 任…

snakeyaml1.x升级2.x导致项目启动报错

snakeyaml1.x升级2.x,修复漏洞 1.背景 在工作中&#xff0c;经常会有漏洞扫描&#xff0c;有一次看到了snakeyaml的漏洞&#xff1a; 项目框架&#xff1a;springBoot 版本&#xff1a;2.2.6.RELEASE snakeyaml 中央仓库信息 snakeyaml中央仓库地址&#xff1a;https://m…

基于 Amazon EKS 的 Stable Diffusion ComfyUI 部署方案

01 背景介绍 Stable Diffusion 作为当下最流行的开源 AI 图像生成模型在游戏行业有着广泛的应用实践&#xff0c;无论是 ToC 面向玩家的游戏社区场景&#xff0c;还是 ToB 面向游戏工作室的美术制作场景&#xff0c;都可以发挥很大的价值&#xff0c;如何更好地使用 Stable Dif…

程序项目打包发布方法,采用InstallShield软件

重点&#xff1a; 1.程序项目做出来了&#xff0c;需要打包发布给用户。如何打包是关键。 2.采用InstallShield软件进行发布。 步骤一&#xff1a;创建一个依赖三方库配置环境的bat文件的项目。 &#xff08;主要测试三方库打包 和如果有bat文件&#xff0c;需要先创建环境&…

YOLOv9独家原创改进|使用DySample超级轻量的动态上采样算子

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、DySample论文摘要 尽管最近的基于内核的动态上采样器如CARAFE、FADE和SAPA取得了令人印象深刻的性能提升&#xff0c;但它们引入了大量的工作量&…

Canvas笔记03:Canvas元素功能、属性、获取、原理等一文讲透

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas元素的知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 Canvas元素是HTML5中的一个重…

加密隧道技术

在现在的互联网上传输数据&#xff0c;首要考虑的就是安全。这关乎到你的隐私&#xff0c;个人信息&#xff0c;财产安全等等重大问题。如果你的程序本身传输的信息没有加密&#xff0c;也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的&#xff0c;…

【二分】第k个缺失的数

第K个缺失的数 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/kth-missing-positive-number/ 题目 题解 二段…

【GPU驱动开发】-mesa简介

前言 不必害怕未知&#xff0c;无需恐惧犯错&#xff0c;做一个Creator&#xff01; 一、mesa介绍 Mesa 是一个开源的3D图形库&#xff0c;它实现了多种图形API&#xff0c;包括 OpenGL、Vulkan 和 OpenCL。Mesa 的目标是提供一个开源、跨平台的图形库&#xff0c;使得开发者…

Qt/自定义控件的封装

新建文件&#xff0c;选择Qt设计师界面类 创建空界面 这是自己控件封装的文件&#xff0c;双击跳转到设计界面进行设计 跳转到其他的ui界面&#xff0c;创建一个widget 右键&#xff0c;选择提升为 在提升的类名称输入刚刚创建的类名&#xff0c;添加后选择提升&#xff0c;勾选…

WINDOWS内存管理 - 返回状态值

DDK大部分函数的返回值类型是NTSTATUS类型。查看DDK.h文件&#xff0c;可以看到 typedef LONG NTSTATUS; NTSTATUS的定义和LONG等价。为了函数的形式统一&#xff0c;所有函数的返回值都是NTSTATUS类型。NTSTATUS就是一个32位的整数&#xff0c;其每位有着不同的含义&#xf…