第84節:Java中的網路編程(中)

来源:https://www.cnblogs.com/dashucoding/archive/2019/02/09/10357709.html
-Advertisement-
Play Games

第84節:Java中的網路編程(中) 實現客戶端和服務端的通信: 客戶端需要的操作,創建socket,明確地址和埠,進行鍵盤錄入,獲取需要的數據,然後將錄入的數據發送給服務端,為socket輸出流,然後進行讀取服務端發送回來的大寫數據,為socket讀取流,最後進行客戶端顯示器的顯示,進行讀寫操作 ...


標題圖

第84節:Java中的網路編程(中)

實現客戶端和服務端的通信:

客戶端需要的操作,創建socket,明確地址和埠,進行鍵盤錄入,獲取需要的數據,然後將錄入的數據發送給服務端,為socket輸出流,然後進行讀取服務端發送回來的大寫數據,為socket讀取流,最後進行客戶端顯示器的顯示,進行讀寫操作,關閉資源。

網路編程TCP客戶端

package com.dashucoding.tcp3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TransClient {

    public static void main(String[] args) throws IOException {
        // 客戶端
        // 創建socket 明確地址和埠
        Socket s = new Socket("192.168.1.151",10005);
        
        // 鍵盤錄入
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        
        // 網路, socket輸出流
//      OutputStream out = s.getOutputStream();
        
        // 傳的是字元數據, 轉換,提高效率
//      BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out));
        
        // 列印流,既能接收字元又能接收位元組
        PrintWriter out = new PrintWriter(s.getOutputStream());
        
        // 讀取流,讀取服務端發來的數據
//      InputStream in = s.getInputStream();
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
        
        // 顯示數據,使用輸出語句
        
        // 頻繁讀寫,讀鍵盤
        String line = null;
        while((line=bufr.readLine()) != null) {
            if("over".equals(line)) {
                break;
            }
            // 讀取鍵盤的數據發送到服務端
            out.println(line);
            
            // 讀取服務端返回的數據
            String upperText = bufIn.readLine();
            System.out.println(upperText);
            
        }
        
        // 關閉資源
        s.close();
        
    }

}

對於服務端,要創建一個服務端的socket,然後明確埠,要讀取客戶端發送過來的數據,要讀取socket輸入流,接著使用socket輸出流,將數據發送給客戶端,進行讀寫操作,關閉資源。

網路編程TCP服務端

package com.dashucoding.tcp3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TransServer {

    public static void main(String[] args) throws IOException {

        System.out.println("服務端運行。。。");
        // 服務端:
        // 創建服務端的socket,明確埠
        ServerSocket ss = new ServerSocket(10005);

        while (true) {
            // 獲取客戶端對象

            Socket s = ss.accept();
            
            // 列印ip地址
            System.out.println(s.getInetAddress().getHostAddress()+"...connected");

            // socket輸入流,讀取客戶端發過來的數據
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

            // socket輸出流,將數據發送給客戶端
//          PrintWriter out = new PrintWriter(s.getOutputStream());
            PrintWriter out = new PrintWriter(s.getOutputStream(), true);

            // 頻繁的讀寫操作
            String line = null;
            while ((line = bufIn.readLine()) != null) {
                // 如果客戶端發送過來的是over
                if ("over".equals(line)) {
                    break;
                }
                
                // 客戶端的數據
                System.out.println(line);
                // 字母轉大寫
                out.println(line.toUpperCase());
                // 都在緩衝區中,刷新
//              out.flush();
            }
            // 關閉客戶端
            s.close();
        }
    }

}
package com.dashucoding.tcp3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TransClient {

    public static void main(String[] args) throws IOException {
        
        System.out.println("客戶端運行。。。");
        // 客戶端
        // 創建socket 明確地址和埠
        Socket s = new Socket("192.168.2.151",10005);
        
        // 鍵盤錄入
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        
        // 網路, socket輸出流
//      OutputStream out = s.getOutputStream();
        
        // 傳的是字元數據, 轉換,提高效率
//      BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out));
        
        // 列印流,既能接收字元又能接收位元組
//      PrintWriter out = new PrintWriter(s.getOutputStream());
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        
        // 讀取流,讀取服務端發來的數據
//      InputStream in = s.getInputStream();
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
        
        // 顯示數據,使用輸出語句
        
        // 頻繁讀寫,讀鍵盤
        String line = null;
        // 都一行,有行終止符才返回
        while((line=bufr.readLine()) != null) {
            // 讀取鍵盤的數據發送到服務端
//          out.print(line+"\r\n");
            out.println(line);
            // 刷數據,都在緩衝區中
//          out.flush();
            if("over".equals(line)) {
                break;
            }
            
            // 讀取服務端返回的數據
            String upperText = bufIn.readLine();
            System.out.println(upperText);
            
        }
        
        // 關閉資源
        s.close();
        
    }

}

上傳文件

void shutdownInput() 此套接字的輸入流置於“流的末尾”
void shutdownOutput() 禁用此套接字的輸出流
String toString() 將此套接字轉換為String.

客戶端:

package com.dashucoding.net.uploadtext;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadTextClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("上傳文件客戶端運行。。。");
        // 客戶端
        // 創建socket 明確地址和埠
        Socket s = new Socket("192.168.43.126", 10006);

        // 讀取文本文件
        BufferedReader bufr = new BufferedReader(new FileReader("tempfile\\client.txt"));
        // 將數據發送給服務端
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        
        
        // 顯示數據,使用輸出語句

        // 頻繁讀寫,讀鍵盤
        String line = null;
        // 都一行,有行終止符才返回true
        while ((line = bufr.readLine()) != null) {
            
            out.println(line);

        }
        
        // 給服務端發送一個結束標記,條約標記
//      out.println("over");
        s.shutdownOutput();
        // 向服務端發送了結束標記
        
        // 讀取流,讀取服務端發來的數據
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String info = bufIn.readLine();
        System.out.println(info);
        // 關閉資源
        bufr.close();
        s.close();
    }

}

服務端:

package com.dashucoding.net.uploadtext;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadTextServer {

    public static void main(String[] args) throws IOException {
        System.out.println("上傳文本服務端運行。。。");
        // 服務端:
        // 創建服務端的socket,明確埠
        ServerSocket ss = new ServerSocket(10006);

        while (true) {
            // 獲取客戶端對象

            Socket s = ss.accept();
            System.out.println(s.getInetAddress().getHostAddress() + "...connected");

            // socket輸入流,讀取客戶端發過來的數據
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(
                    s.getInputStream()));

            // socket輸出流,目的是文件
            PrintWriter pw = new PrintWriter(new FileWriter("tempfile\\server.txt"), true);

            // 頻繁的讀寫操作
            String line = null;
            while ((line = bufIn.readLine()) != null) {
                if("over".equals(line)) {
                    break;
                }
                
                pw.println(line);
            }
            
            // 發回給客戶端,上傳成功
            PrintWriter out = new PrintWriter(s.getOutputStream(),true);
            out.println("上傳成功");
            
            // 關閉客戶端
            s.close();
        }
    }

}

上傳圖片

客戶端:

package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

    public static void main(String[] args) throws IOException {
        
        System.out.println("上傳圖片客戶端運行。。。");
        // 上傳圖片
        // 創建socket
        Socket s = new Socket("192.168.43.126",10007);
        
        // 讀取圖片,圖片路徑
        File picFile = new File("tempfile\\001.jpg");
        FileInputStream fis = new FileInputStream(picFile);
        
        // socket 輸出流
        OutputStream out = s.getOutputStream();
        
        byte[] buf = new byte[1024];
        int len = 0;
        while((len=fis.read(buf)) != -1) {
            out.write(buf,0,len);
        }
        
        // 告訴伺服器端圖片數據發送完畢,不要等著讀了。
        s.shutdownOutput();
        
        // 讀取上傳成功
        InputStream in = s.getInputStream();
        byte[] bufIn = new byte[1024];
        int lenIn = in.read(bufIn);
        System.out.println(new String(bufIn, 0, lenIn));
        
        // 關閉
        fis.close();
        s.close();
        
    }

}

服務端:

package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.omg.CORBA_2_3.portable.OutputStream;

public class UploadPicServer {

    public static void main(String[] args) throws IOException {
        
        
        System.out.println("上傳圖片服務端運行。。。");
        // 創建serversocket
        ServerSocket ss = new ServerSocket(10007);

        while (true) { // 實現上傳多回
            // 獲取客戶端
            Socket s = ss.accept();
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+"...connected");

            // 讀取圖片數據
            InputStream in = s.getInputStream();

            // 寫圖片數據到文件
            File picFile = new File("tempfile\\server.jpg"); // 存儲圖片
            FileOutputStream fos = new FileOutputStream(picFile);

            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = in.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            // 給客戶端返回一個回饋信息
            java.io.OutputStream out = s.getOutputStream();
            out.write("上傳成功".getBytes());

            // 關閉資源
            fos.close();
            s.close();
        }
    }

}

如何解決圖片重名的問題:

package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

    public static void main(String[] args) throws IOException {
        
        System.out.println("上傳圖片客戶端運行。。。");
        // 上傳圖片
        // 創建socket
        Socket s = new Socket("192.168",10007);
        
        // 讀取圖片,圖片路徑
        File picFile = new File("tempfile\\001.jpg");
        FileInputStream fis = new FileInputStream(picFile);
        
        // socket 輸出流
        OutputStream out = s.getOutputStream();
        
        byte[] buf = new byte[1024];
        int len = 0;
        while((len=fis.read(buf)) != -1) {
            out.write(buf,0,len);
        }
        
        // 告訴伺服器端圖片數據發送完畢,不要等著讀了。
        s.shutdownOutput();
        
        // 讀取上傳成功
        InputStream in = s.getInputStream();
        byte[] bufIn = new byte[1024];
        int lenIn = in.read(bufIn);
        System.out.println(new String(bufIn, 0, lenIn));
        
        // 關閉
        fis.close();
        s.close();
        
    }

}
package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.omg.CORBA_2_3.portable.OutputStream;

public class UploadPicServer {

    public static void main(String[] args) throws IOException {
        
        
        System.out.println("上傳圖片服務端運行。。。");
        // 創建serversocket
        ServerSocket ss = new ServerSocket(10007);

        while (true) { // 實現上傳多回
            // 獲取客戶端
            Socket s = ss.accept();
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+"...connected");

            // 讀取圖片數據
            InputStream in = s.getInputStream();

            // 寫圖片數據到文件
            // 創建目錄
            File dir = new File("e:\\uploadpic");
            // 如果不存在就創建目錄
            if(!dir.exists()) {
                dir.mkdir();
            }
            // 給文件編號
            // 加計數器
            int count = 1;
            // 防止第二次為0
            File picFile = new File(dir, ip + "("+count+").jpg");
//          if(picFile.exists()) {
            while(picFile.exists()) {
                count++;
                picFile = new File(dir, ip + "("+count+").jpg");
            }
            FileOutputStream fos = new FileOutputStream(picFile);
            
//          File picFile = new File("tempfile\\" + ip + ".jpg");
//          File picFile = new File("tempfile\\server.jpg"); 
            // 存儲圖片
            

            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = in.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            // 給客戶端返回一個回饋信息
            java.io.OutputStream out = s.getOutputStream();
            out.write("上傳成功".getBytes());

            // 關閉資源
            fos.close();
            s.close();
        }
    }

}

解決上傳併發的問題

結構

package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class UploadPicClient {

    public static void main(String[] args) throws IOException {
        
        System.out.println("上傳圖片客戶端運行。。。");
        // 上傳圖片
        // 創建socket
        Socket s = new Socket("",10007);
        
        // 讀取圖片,圖片路徑
        File picFile = new File("tempfile\\001.jpg");
        FileInputStream fis = new FileInputStream(picFile);
        
        // socket 輸出流
        OutputStream out = s.getOutputStream();
        
        byte[] buf = new byte[1024];
        int len = 0;
        while((len=fis.read(buf)) != -1) {
            out.write(buf,0,len);
        }
        
        // 告訴伺服器端圖片數據發送完畢,不要等著讀了。
        s.shutdownOutput();
        
        // 讀取上傳成功
        InputStream in = s.getInputStream();
        byte[] bufIn = new byte[1024];
        int lenIn = in.read(bufIn);
        System.out.println(new String(bufIn, 0, lenIn));
        
        // 關閉
        fis.close();
        s.close();
        
    }

}
package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.omg.CORBA_2_3.portable.OutputStream;

public class UploadPicServer {

    public static void main(String[] args) throws IOException {

        System.out.println("上傳圖片服務端運行。。。");
        // 創建serversocket
        ServerSocket ss = new ServerSocket(10007);

        while (true) { // 實現上傳多回
            // 獲取客戶端
            Socket s = ss.accept();

            new Thread(new UploadPic(s)).start();
        }
    }

}
package com.dashucoding.net.uploadpic;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

// 創建任務
// 線程完成任務後,會自動結束
public class UploadPic implements Runnable {

    private Socket s;

    // 創建構造函數
    public UploadPic(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            // 主線程負債接收客戶端,其它線程負責接收數據

            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip + "...connected");

            // 讀取圖片數據
            InputStream in = s.getInputStream();

            // 寫圖片數據到文件
            // 創建目錄
            File dir = new File("e:\\uploadpic");
            // 如果不存在就創建目錄
            if (!dir.exists()) {
                dir.mkdir();
            }
            // 給文件編號
            // 加計數器
            int count = 1;
            // 防止第二次為0
            File picFile = new File(dir, ip + "(" + count + ").jpg");
//                      if(picFile.exists()) {
            while (picFile.exists()) {
                count++;
                picFile = new File(dir, ip + "(" + count + ").jpg");
            }
            FileOutputStream fos = new FileOutputStream(picFile);

            // 開始迴圈進行讀寫操作
            // 一個線程,不能處理併發的數據
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = in.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            // 給客戶端返回一個回饋信息
            java.io.OutputStream out = s.getOutputStream();
            out.write("上傳成功".getBytes());

            // 關閉資源
            fos.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

客戶端:瀏覽器,服務端:Tomcat

埠號,\con\server.xml

效果

瀏覽器發送HTTP請求

GET / HTTP / 1.1
Accept: 
Accept-Language:
Accept-Encoding:
User-Agent:
Host:
Connection:

請求行,協議,應用層協議,超文本傳輸協議,請求方式,訪問資源的路徑,http的協議版本,

效果

package com.dashucoding.net.myserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyBrowser {

    public static void main(String[] args) throws UnknownHostException, IOException {
        // 瀏覽器發送http消息
        Socket s = new Socket("",8080);
        
        // 把信息發送給服務端
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        out.println("");
        out.println();//空行
        
        // 讀取服務端的數據
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        String text = new String(buf,0,len);
        System.out.print(text);

        s.close();
    }

}

發送和http協議相同的信息,收到了Tomcat伺服器返回的數據。

版本

插件

package com.dashucoding.net.myserver;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class MyBrowserGui extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MyBrowserGui frame = new MyBrowserGui();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MyBrowserGui() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}

下載插件

url的描述

java.net
類 url
java.lang.object
java.net.url
所有已實現的介面:
serializable

public final class url extends object implements serializable

url 表示一個統一的資源定位符,用於指向互聯網"資源"的指針。
// 構造方法
url (string spec):
根據string表示形式創建url對象

url (string protocol, string host, int port, string file)
根據指定protocol,host,port號和file創建url對象
package com.dashucoding.net.url;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLDemo {

    public static void main(String[] args) throws IOException {
        
String str_url = "http://";
        
        //將url地址封裝成對象。
        URL url = new URL(str_url);
        
//      System.out.println("getProtocol:"+url.getProtocol());
//      System.out.println("getHost:"+url.getHost());
//      System.out.println("getPort:"+url.getPort());
//      System.out.println("getPath:"+url.getPath());
//      System.out.println("getFile:"+url.getFile());
//      System.out.println("getQuery:"+url.getQuery());
        
        //獲取指定資源的連接對象,封裝了socket。
        URLConnection conn = url.openConnection();
        
//      System.out.println(conn);
        
        InputStream in = conn.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        String text = new String(buf,0,len);
        System.out.println(text);
        
        
    }

}
openConnection
public URLConnection openConnection() throws IOException
返回一個URLConnection對象,它表示到url所引用的遠程對象的連接

urlconnection

圖片

package com.dashucoding.net.url;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLDemo {

    public static void main(String[] args) throws IOException {

        String str_url = "http://";

        // 將url地址封裝成對象。
        URL url = new URL(str_url);

//      System.out.println("getProtocol:"+url.getProtocol());
//      System.out.println("getHost:"+url.getHost());
//      System.out.println("getPort:"+url.getPort());
//      System.out.println("getPath:"+url.getPath());
//      System.out.println("getFile:"+url.getFile());
//      System.out.println("getQuery:"+url.getQuery());

        // 獲取指定資源的連接對象,封裝了socket。
        URLConnection conn = url.openConnection();

//      System.out.println(conn);

        InputStream in = conn.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        String text = new String(buf, 0, len);
        System.out.println(text);

    }

}

網路編程中HTTP版本的區別

http1.0請求一次連接就斷開了,一次連接只能有一次請求,http1.1一次連接多次請求。

URL用於解析url地址,URLConnection用於獲取url的連接。

常見的網路架構:cs和bs

client / server
客戶端和服務端,維護麻煩

browser / server
只需要服務端,只要系統內置瀏覽器
所有的運算在服務端,簡單易用

結言

好了,歡迎在留言區留言,與大家分享你的經驗和心得。

感謝你學習今天的內容,如果你覺得這篇文章對你有幫助的話,也歡迎把它分享給更多的朋友,感謝。

達叔小生:往後餘生,唯獨有你
You and me, we are family !
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1

結語

  • 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
  • 小禮物走一走 or 點贊

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目: 一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下: 首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然後將計算的和對11取模得到值Z;最後按照以下關係對應Z值與校驗碼M的值: Z:0 ...
  • lxml是Python語言和XML以及HTML工作的功能最豐富和最容易使用的庫。lxml是為libxml2和libxslt庫的一個Python化的綁定。它與眾不同的地方是它兼顧了這些庫的速度和功能完整性。高效率解析Xpath,用於操作爬蟲爬取網址url。 而在Windows中由於原始Python3的 ...
  • 把mvc或mtv框架的model資料庫,view:html,control邏輯處理,url判別,wsgiref集中在一個文件 代碼如下 ...
  • list刪除 為什麼迴圈刪除沒有刪乾凈呢,原因就是列表在迴圈遍歷的時候裡面相當於有個變數指針,迴圈第一次,這個index = 0,刪除成功,然後列表中的索引為1的值就往前挪,就變成 了索引值為0的,然後index=1,跳過現在索引為0繼續刪除索引為1的數值。 正確刪除的做法: 意思就是創建一個新列表 ...
  • 題意 "題目鏈接" Sol 知道FFT能做字元串匹配的話這就是個裸題了吧。。 考慮把B翻轉過來,如果$\sum_{k = 0}^M (B_{i k} A_k)^2 B_{i k} A_k = 0$ 那麼說明能匹配。然後拆開三波FFT就行了 ...
  • 線段樹 線段樹的每一個節點都代表一段 區間 線段樹用於維護符合結合律的的信息 (比如區間max/min、sum、xor之類的) 線段樹 在最壞的情況下效率低於分塊(大常數) 線段樹 是一顆二叉樹,對於每個父親節點(編號i)存在兩個兒子,編號分別為2i和2i+1. 建樹 1 void build(ll ...
  • seek() 1.當一個文件打開時,指針預設在開頭 2.seek(0,0)把指針拉回開頭 3.seek()在python3中不支持往左位移(指針不能向左邊調)(第一個參數不能為負數) 4.seek(位移量,參照物) 總結:seek()相當於無形的滑鼠操作 tell() tell就是獲取當前指針到開頭 ...
  • 題意 "題目鏈接" Sol 異或高斯消元的板子題。 bitset優化一下,複雜度$O(\frac{nm}{32})$ 找最優解可以考慮高斯消元的過程,因為異或的特殊性質,每次向下找的時候找到第一個1然後交換就行,這樣顯然是最優的 cpp include using namespace std; co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...