国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì)

這篇具有很好參考價(jià)值的文章主要介紹了互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

需求

多線程TCP服務(wù)器

線程池TCP服務(wù)器

測(cè)試

日志模塊


需求

多線程TCP服務(wù)器(30分):

設(shè)計(jì)編寫一個(gè)TCP服務(wù)器端程序,需使用多線程處理客戶端的連接請(qǐng)求??蛻舳伺c服務(wù)器端之間的通信內(nèi)容,以及服務(wù)器端的處理功能等可自由設(shè)計(jì)拓展,無特別限制和要求。

線程池TCP服務(wù)器(30分):

設(shè)計(jì)編寫一個(gè)TCP服務(wù)器端程序,需使用線程池處理客戶端的連接請(qǐng)求??蛻舳伺c服務(wù)器端之間的通信內(nèi)容,以及服務(wù)器端的處理功能等可自由設(shè)計(jì)拓展,無特別限制和要求,但應(yīng)與第1項(xiàng)要求中的服務(wù)器功能一致,便于對(duì)比分析。

比較分析不同編程技術(shù)對(duì)服務(wù)器性能的影響(20分):

自由編寫客戶端程序和設(shè)計(jì)測(cè)試方式,對(duì)1和2中的服務(wù)器端程序進(jìn)行測(cè)試,分析比較兩個(gè)服務(wù)器的并發(fā)處理能力。

設(shè)計(jì)編寫可重用的服務(wù)器日志程序模塊,日志記錄的內(nèi)容和日志存儲(chǔ)方式可自定(比如可以記錄客戶端的連接時(shí)間、客戶端IP等,日志存儲(chǔ)為.TXT或.log文件等),分別在1和2的服務(wù)器程序中調(diào)用該日志程序模塊,使多線程TCP服務(wù)器和線程池TCP服務(wù)器都具備日志功能,注意線程之間的同步操作處理。(20分)

多線程TCP服務(wù)器

這段代碼是一個(gè)基于Java的多線程服務(wù)器實(shí)現(xiàn),用于接收客戶端的連接并處理其發(fā)送的消息。

  1. 首先,在MultithreadingServer類的main方法中:

    • 創(chuàng)建了一個(gè)ServerSocket對(duì)象,并指定它監(jiān)聽的端口號(hào)為8888,同時(shí)設(shè)置最大連接數(shù)量為10000。
    • 進(jìn)入一個(gè)無限循環(huán),用于持續(xù)接受客戶端的連接請(qǐng)求。
    • 每次循環(huán),當(dāng)有客戶端連接時(shí),創(chuàng)建一個(gè)新的MultiThread實(shí)例,并傳入對(duì)應(yīng)的Socket對(duì)象。
    • 同時(shí),創(chuàng)建一個(gè)Logger實(shí)例,記錄連接的相關(guān)信息,包括客戶端的IP地址、連接時(shí)間和日志文件名。
  2. MultiThread類中:

    • 繼承了Thread類,并重寫了run方法。
    • run方法中,通過BufferedReaderSocket的輸入流獲取一個(gè)字符輸入流,并通過InputStreamReader將其轉(zhuǎn)換為字符流,然后讀取客戶端發(fā)送的數(shù)據(jù)。
    • 使用一個(gè)循環(huán)來連續(xù)讀取,直到達(dá)到輸入流的末尾(客戶端關(guān)閉連接)為止。
    • 在每次循環(huán)中,打印接收到的消息到標(biāo)準(zhǔn)輸出。
    • 最后,關(guān)閉輸入流和Socket連接。

整體而言,這段代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的多線程服務(wù)器,能夠接收并處理客戶端的連接請(qǐng)求,以及讀取和輸出客戶端發(fā)送的消息。日志記錄部分使用了自定義的Logger類,但其具體實(shí)現(xiàn)不在這段代碼中顯示。需要注意的是,異常處理方面可能需要根據(jù)實(shí)際需求進(jìn)行補(bǔ)充和調(diào)整。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class MultithreadingServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(8888, 10000);
            while (true) {
                Socket client = serverSocket.accept();
                new MultiThread(client).start();
                new Logger(client.getInetAddress().getHostAddress(), new Date(), "LogMultithreadingServer.txt");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

class MultiThread extends Thread {
    private Socket socket = null;

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

    public void run() {
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = null;
            while ((message = input.readLine()) != null) {
                System.out.println(message);
            }
            input.close();
            socket.close();
        } catch (IOException error) {
            error.printStackTrace();
        }
    }
}

線程池TCP服務(wù)器

這段代碼是一個(gè)使用線程池的多線程服務(wù)器實(shí)現(xiàn),與前面的代碼相比,在并發(fā)處理客戶端連接方面進(jìn)行了改進(jìn)。

  1. ThreadPoolServer類的main方法中:

    • 創(chuàng)建了一個(gè)具有200個(gè)線程的固定大小線程池ExecutorService。
    • 創(chuàng)建了一個(gè)ServerSocket對(duì)象,并指定它監(jiān)聽的端口號(hào)為9999,同時(shí)設(shè)置最大連接數(shù)量為10000。
    • 進(jìn)入一個(gè)無限循環(huán),用于持續(xù)接受客戶端的連接請(qǐng)求。
    • 每次循環(huán),當(dāng)有客戶端連接時(shí),將一個(gè)新的TheadPoolTask任務(wù)提交給線程池進(jìn)行執(zhí)行。
    • 同時(shí),創(chuàng)建一個(gè)Logger實(shí)例,記錄連接的相關(guān)信息,包括客戶端的IP地址、連接時(shí)間和日志文件名。
  2. TheadPoolTask類中:

    • 實(shí)現(xiàn)了Runnable接口,并重寫了run方法。
    • run方法中,通過BufferedReaderSocket的輸入流獲取一個(gè)字符輸入流,并通過InputStreamReader將其轉(zhuǎn)換為字符流,然后讀取客戶端發(fā)送的數(shù)據(jù)。
    • 使用一個(gè)循環(huán)來連續(xù)讀取,直到達(dá)到輸入流的末尾(客戶端關(guān)閉連接)為止。
    • 在每次循環(huán)中,打印接收到的消息到標(biāo)準(zhǔn)輸出。
    • 最后,關(guān)閉輸入流和Socket連接。

整體而言,這段代碼與前一段代碼類似,不同之處在于使用了線程池來管理線程資源,提高了并發(fā)處理能力。通過將任務(wù)提交給線程池執(zhí)行,可以控制并發(fā)線程數(shù),并重復(fù)利用線程,避免頻繁創(chuàng)建和銷毀線程帶來的開銷。需要注意的是,異常處理方面可能需要根據(jù)實(shí)際需求進(jìn)行補(bǔ)充和調(diào)整。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolServer {
    public static void main(String[] args) {
        ExecutorService executorService= Executors.newFixedThreadPool(200);
        try{
            ServerSocket serverSocket=new ServerSocket(9999,10000);
            while(true){
                Socket client=serverSocket.accept();
                executorService.execute(new TheadPoolTask(client));
                new Logger(client.getInetAddress().getHostAddress(),new Date(),"LogThreadPoolServer.txt");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            executorService.shutdown();
        }
    }
}
class TheadPoolTask implements Runnable{
    private Socket socket=null;
    public TheadPoolTask(Socket socket){
        this.socket=socket;
    }
    public void run(){
        try{
            BufferedReader input=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message=null;
            while((message=input.readLine())!=null){
                System.out.println(message);
            }
            input.close();
            socket.close();

        }catch (IOException error){
            error.printStackTrace();
        }
    }
}

測(cè)試

編寫一個(gè)壓力測(cè)試程序,測(cè)試多線程服務(wù)器和線程池服務(wù)器在高并發(fā)時(shí)的表現(xiàn),實(shí)現(xiàn)run()方法,發(fā)起連接請(qǐng)求,為了保證多線程并發(fā)訪問long類型變量時(shí)的線程安全性,使用線程安全的AtomicLong類來記錄服務(wù)器響應(yīng)的時(shí)間,如圖7所示,附件已含源代碼。

互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì),互聯(lián)網(wǎng)編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)

圖7

主程序同時(shí)向兩個(gè)服務(wù)器發(fā)起多個(gè)連接,連接規(guī)模從1000個(gè)連接請(qǐng)求開始一直增加到10000個(gè),通過在短時(shí)間內(nèi)發(fā)起大量連接請(qǐng)求來對(duì)服務(wù)器進(jìn)行壓力測(cè)試,如圖8所示。

互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì),互聯(lián)網(wǎng)編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)

圖8

測(cè)試過程數(shù)據(jù)如圖9所示。

互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì),互聯(lián)網(wǎng)編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)

圖9

分析兩個(gè)服務(wù)器的表現(xiàn)情況,如圖10所示,可見在處理大量短任務(wù)(如處理網(wǎng)絡(luò)請(qǐng)求)的情況下,使用線程池可以避免頻繁地創(chuàng)建、銷毀線程所帶來的開銷,因此會(huì)更快一些。

互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì),互聯(lián)網(wǎng)編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)

圖10

這段代碼是一個(gè)簡(jiǎn)單的測(cè)試服務(wù)器和客戶端的程序。

  1. TestServerClient類的main方法中:

    • 通過循環(huán)來控制不同規(guī)模(power)的測(cè)試。
    • 在每個(gè)測(cè)試規(guī)模下,通過嵌套循環(huán)啟動(dòng)一定數(shù)量(2000)的測(cè)試任務(wù)。
    • 每個(gè)測(cè)試任務(wù)使用TestTask類創(chuàng)建一個(gè)線程,構(gòu)造函數(shù)傳入不同的端口號(hào)(9999或8888),然后調(diào)用run方法運(yùn)行測(cè)試任務(wù)。
    • 在每次測(cè)試任務(wù)完成后,將消耗的時(shí)間輸出到控制臺(tái)。
  2. TestTask類中:

    • 定義了一個(gè)port變量,表示客戶端連接的目標(biāo)端口。
    • 聲明了兩個(gè)靜態(tài)的AtomicLong對(duì)象timePooltimeMulti,用于記錄線程池和多線程方式的測(cè)試消耗時(shí)間。
    • 在構(gòu)造函數(shù)中接收一個(gè)端口號(hào),并將其賦值給port變量。
    • run方法實(shí)現(xiàn)了客戶端的測(cè)試邏輯:
      • 創(chuàng)建一個(gè)空的Socket對(duì)象。
      • 構(gòu)建InetSocketAddress對(duì)象,指定本地主機(jī)地址和目標(biāo)端口。
      • 記錄當(dāng)前時(shí)間為起始時(shí)間。
      • 調(diào)用socket.connect方法與服務(wù)器建立連接,等待連接完成。
      • 關(guān)閉socket對(duì)象。
      • 記錄當(dāng)前時(shí)間為結(jié)束時(shí)間。
      • 根據(jù)不同的端口號(hào),將測(cè)試消耗時(shí)間累加到相應(yīng)的AtomicLong對(duì)象中。

該程序的主要目的是通過多次連接服務(wù)器的測(cè)試來比較線程池和多線程方式的性能消耗。它會(huì)啟動(dòng)一定數(shù)量的測(cè)試任務(wù),并分別記錄兩種方式的測(cè)試消耗時(shí)間。在每次測(cè)試任務(wù)完成后,將消耗時(shí)間輸出到控制臺(tái)。通過對(duì)不同規(guī)模測(cè)試結(jié)果的比較,可以初步評(píng)估線程池和多線程方式的性能表現(xiàn)。

import java.io.IOException;
import java.net.*;
import java.util.concurrent.atomic.AtomicLong;

public class TestServerClient {
    public static void main(String[] args) {
        for (int power = 1; power <= 10; power++) {
            int scale = 2000*power ;
            for (int i = 0; i < 2000; i++) {
                if(i%2==0)
                new TestTask(9999).run();
                else new TestTask(8888).run();
            }
            System.out.printf("線程池:規(guī)模為%d消耗時(shí)間%d毫秒\n", scale/2, TestTask.timePool.get());
            System.out.printf("多線程:規(guī)模為%d消耗時(shí)間%d毫秒\n", scale/2, TestTask.timeMulti.get());
        }
    }
}

class TestTask{
    private final int port;
    public static AtomicLong timePool =new AtomicLong();
    public static AtomicLong timeMulti=new AtomicLong();

    public TestTask(int port) {
        this.port = port;
    }

    public void run() {
        try {
            Socket socket = new Socket();
            SocketAddress socketAddress=new InetSocketAddress(InetAddress.getLocalHost(), port);
            long start=System.currentTimeMillis();
            socket.connect(socketAddress);
            while(!socket.isConnected()){}
            socket.close();
            long end=System.currentTimeMillis();
            if(port==9999)
            timePool.addAndGet(end-start);
            else timeMulti.addAndGet(end-start);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}

日志模塊

這段代碼是一個(gè)簡(jiǎn)單的日志記錄器類。它具有以下功能:

  1. 構(gòu)造函數(shù):接受一個(gè)IP地址、日期和文件路徑作為參數(shù),并生成一條以IP地址和日期為內(nèi)容的日志信息。

  2. keep() 方法:該方法使用了 synchronized 關(guān)鍵字,以確保在多線程環(huán)境下只有一個(gè)線程可以訪問該方法。在方法內(nèi)部,它創(chuàng)建一個(gè) BufferedWriter 對(duì)象,并將日志內(nèi)容寫入指定的文件中。

總體來說,這個(gè)代碼實(shí)現(xiàn)了一個(gè)基本的日志記錄功能,將用戶登錄的 IP 地址和日期寫入指定的文件中。文章來源地址http://www.zghlxwxcb.cn/news/detail-515844.html

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class Logger {
    private final String log;
    private final String filePath;
    public Logger(String IP, Date date,String filePath){
        log=IP+" login at "+date.toString()+'\n';
        this.filePath=filePath;
        keep();
    }
    private synchronized void keep(){
        try {
            BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(filePath,true));
            bufferedWriter.write(log);
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到了這里,關(guān)于互聯(lián)網(wǎng)編程之多線程/線程池TCP服務(wù)器端程序設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Windows配置互聯(lián)網(wǎng)訪問檢測(cè)服務(wù)器-IspSrv

    Windows配置互聯(lián)網(wǎng)訪問檢測(cè)服務(wù)器-IspSrv

    賽題 1、搭建服務(wù) 2、配置服務(wù) 3、配置IIS 4、客戶端 ?????? 原理 (一)服務(wù)器 IspSrv 上的工作任務(wù) 1.互聯(lián)網(wǎng)訪問檢測(cè)服務(wù)器 ?為了模擬 Internet 訪問測(cè)試,請(qǐng)搭建網(wǎng)卡互聯(lián)網(wǎng)檢測(cè)服務(wù)。

    2024年02月13日
    瀏覽(24)
  • 寶塔面板搭建Discuz論壇并發(fā)布互聯(lián)網(wǎng)訪問【無需云服務(wù)器】

    寶塔面板搭建Discuz論壇并發(fā)布互聯(lián)網(wǎng)訪問【無需云服務(wù)器】

    ?個(gè)人主頁:bit me?? 轉(zhuǎn)載自cpolar極點(diǎn)云的文章:Linux寶塔面板搭建Discuz論壇,并公網(wǎng)遠(yuǎn)程訪問【內(nèi)網(wǎng)穿透】 Crossday Discuz! Board(以下簡(jiǎn)稱 Discuz!)是一套通用的社區(qū)論壇軟件系統(tǒng),用戶可以在不需要任何編程的基礎(chǔ)上,通過簡(jiǎn)單的設(shè)置和安裝,在互聯(lián)網(wǎng)上搭建起具備完善功能

    2024年02月03日
    瀏覽(35)
  • 分享本周所學(xué)——在Windows上搭建自己的Git服務(wù)器并支持互聯(lián)網(wǎng)遠(yuǎn)程訪問

    分享本周所學(xué)——在Windows上搭建自己的Git服務(wù)器并支持互聯(lián)網(wǎng)遠(yuǎn)程訪問

    ????????大家好,歡迎來到《分享本周所學(xué)》第十期。本人是一名人工智能初學(xué)者(雖然我最近寫的東西都跟人工智能沒什么關(guān)系),剛剛上完大一。之前想跟同學(xué)搞項(xiàng)目,我的學(xué)校自己有一個(gè)GitLab服務(wù)器,于是就把項(xiàng)目存在上面,但是后來收到學(xué)校郵件說學(xué)校服務(wù)器不允

    2024年02月09日
    瀏覽(28)
  • 網(wǎng)絡(luò)互聯(lián)與互聯(lián)網(wǎng) - TCP 協(xié)議詳解

    網(wǎng)絡(luò)互聯(lián)與互聯(lián)網(wǎng) - TCP 協(xié)議詳解

    在 TCP/IP 協(xié)議簇 中有兩個(gè)傳輸協(xié)議 TCP :Transmission Control Protocol, 傳輸控制協(xié)議 ,是面向 連接 的、可靠的。 UDP :User Datagram Protocol, 用戶數(shù)據(jù)報(bào)協(xié)議 ,是面向 無連接 的、不可靠的。 參數(shù) 英文名 說明 源端口 Sorce Port 目的端口 Destination Port 序號(hào) Sequence Number 保證數(shù)據(jù)的可靠

    2024年02月11日
    瀏覽(32)
  • 《互聯(lián)網(wǎng)的世界》第三講-tcp

    《互聯(lián)網(wǎng)的世界》第三講-tcp

    dns 找到了地址,spf 確定了路徑,如何運(yùn)輸數(shù)據(jù)呢?今天講 tcp。 計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域的特定技術(shù)是最后當(dāng)你干這個(gè)事時(shí)才要用的,我對(duì)孩子們這樣說,實(shí)際上你可以隨便看一個(gè)快遞單子來理解端到端傳輸協(xié)議。 源地址,目標(biāo)地址一定要有,一個(gè)地址可能有不同住戶,也就是 por

    2024年03月10日
    瀏覽(23)
  • 從 TCP/IP 到 CCIP:Chainlink 與合約的互聯(lián)網(wǎng)

    從 TCP/IP 到 CCIP:Chainlink 與合約的互聯(lián)網(wǎng)

    未來已來。通過鏈上金融重塑資本市場(chǎng)預(yù)計(jì)將影響全球價(jià)值 8.67 萬億美元的資產(chǎn)的使用方式。 Chainlink 的跨鏈互操作性協(xié)議(CCIP)將會(huì)這一轉(zhuǎn)型過程中發(fā)揮重要作用,這是區(qū)塊鏈連接性和互操作性的突破,使得 DeFi 應(yīng)用可以通過單一界面訪問用戶,并與其他不同區(qū)塊鏈上的

    2024年02月14日
    瀏覽(17)
  • 互聯(lián)網(wǎng)基石:TCP/IP 四層模型,由淺入深直擊原理!

    互聯(lián)網(wǎng)基石:TCP/IP 四層模型,由淺入深直擊原理!

    TCP/IP 是迄今為止最常用的網(wǎng)絡(luò)互聯(lián)協(xié)議套件,在全球互聯(lián)網(wǎng)運(yùn)營(yíng)方面發(fā)揮了巨大作用,可以這樣說 TCP/IP 在互聯(lián)網(wǎng)世界無處不在! TCP/IP 最初由 DARPA(美國(guó)國(guó)防高級(jí)研究計(jì)劃局)的兩位科學(xué)家于 1970 年代開發(fā),這兩位科學(xué)家分為是 Vint Cerf 和 Bob Kahn,被稱為 Internet 之父 。 當(dāng)時(shí)

    2024年02月04日
    瀏覽(23)
  • 互聯(lián)網(wǎng)編程之域名IP轉(zhuǎn)換及應(yīng)用URL類定位和獲取數(shù)據(jù)編程

    目錄 需求 域名解析程序 下載功能程序 斷點(diǎn)續(xù)傳下載 編寫域名解析程序(30分): 編寫一個(gè)可重用的域名解析程序模塊,使之能夠?qū)⒂脩糨斎氲挠蛎馕鰹镮P地址。 編寫下載功能程序(40分): 使用URL類,編寫一個(gè)可重用的下載程序模塊,完成HTML和圖像文件的下載。即用戶

    2024年02月12日
    瀏覽(34)
  • 互聯(lián)網(wǎng)Java工程師面試題·Java 并發(fā)編程篇·第五彈

    互聯(lián)網(wǎng)Java工程師面試題·Java 并發(fā)編程篇·第五彈

    目錄 52、什么是線程池? 為什么要使用它? 53、怎么檢測(cè)一個(gè)線程是否擁有鎖? 54、你如何在 Java 中獲取線程堆棧? 55、JVM 中哪個(gè)參數(shù)是用來控制線程的棧堆棧小的? 56、Thread 類中的 yield 方法有什么作用? 57、Java 中 ConcurrentHashMap 的并發(fā)度是什么? 58、Java 中 Semaphore 是什么

    2024年02月07日
    瀏覽(24)
  • 書棧網(wǎng)-BookStack 程序員IT互聯(lián)網(wǎng)開源編程書籍免費(fèi)閱讀

    書棧網(wǎng)-BookStack 程序員IT互聯(lián)網(wǎng)開源編程書籍免費(fèi)閱讀

    書棧網(wǎng)是一個(gè)提供各種編程語言和技術(shù)的開源書籍免費(fèi)閱讀的網(wǎng)站,涵蓋前端、后端、數(shù)據(jù)庫、算法、數(shù)據(jù)分析等領(lǐng)域。您可以在書棧網(wǎng)找到最新最熱的開源書籍,以及相關(guān)的文檔資料。 書棧網(wǎng)提供網(wǎng)頁版跟手機(jī)APP。 網(wǎng)頁版書棧網(wǎng)官網(wǎng)地址:https://www.bookstack.cn/ 手機(jī)版 Book

    2024年02月04日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包