2024年8月

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os/exec"
    "runtime"
    "time"
)

func openBrowser(url string) {
    var cmd *exec.Cmd

    switch runtime.GOOS {
    case "darwin":
        cmd = exec.Command("open", url)
    case "linux":
        cmd = exec.Command("xdg-open", url)
    case "windows":
        cmd = exec.Command("cmd", "/c", "start", url)
    default:
        log.Println("Unsupported OS")
        return
    }

    err := cmd.Start()
    if err != nil {
        log.Printf("Failed to open browser: %v", err)
    }
}
func main() {

    // 设置静态文件服务目录为当前目录下的www文件夹
    fs := http.FileServer(http.Dir("./www"))

    // 添加一个新的路由来处理发送参数的请求
    http.HandleFunc("/sendParams", sendParamsHandler)

    http.HandleFunc("/sendMoreParams", sendMoreParamsHandler)
    //另一个请求 http.HandleFunc("/anotherRequest", anotherRequestHandler)
    // 将请求转发到静态文件服务器
    // 使用http.HandleFunc来处理根URL("/")的请求
    // 使用FileServer来服务静态文件
    http.Handle("/", http.StripPrefix("/", fs))
    openBrowser("http://localhost:8080")
    // 设置服务器监听的端口
    log.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }

}

// sendParamsHandler 处理参数传输请求。
// 它接受 POST 请求,并解析请求体中的 "param" 参数。
// 在接收参数后,它会打印参数值,向客户端响应参数值,
// 并依次关闭 HTTP 服务器和浏览器。
func sendParamsHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        r.ParseForm()
        param := r.Form.Get("param")
        fmt.Println("Received parameter:", param)
        fmt.Fprintf(w, "Parameter received: %s", param)

        // 关闭 HTTP 服务器
        shutdownServer()

        // 关闭浏览器
        closeBrowser()
    } else {
        http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
    }
}

// 处理发送参数的请求
func sendMoreParamsHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        body, err := ioutil.ReadAll(r.Body)
        if err != nil {
            http.Error(w, "Error reading request body", http.StatusBadRequest)
            return
        }
        defer r.Body.Close()

        var param map[string]string
        err = json.Unmarshal(body, &param)
        if err != nil {
            http.Error(w, "Error parsing JSON", http.StatusBadRequest)
            return
        }

        message, ok := param["message"]
        if !ok {
            http.Error(w, "Missing 'message' field in JSON", http.StatusBadRequest)
            return
        }
        aaa, ok := param["aaa"]
        if !ok {
            http.Error(w, "Missing 'message' field in JSON", http.StatusBadRequest)
            return
        }
        fmt.Println("Received parameter:", aaa)
        fmt.Println("Received parameter:", message)
        fmt.Fprintf(w, "Parameter received: %s", message)

        // 关闭 HTTP 服务器
        //shutdownServer()

        // 关闭浏览器
        //closeBrowser()
    } else {
        http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
    }
}

// 关闭 HTTP 服务器
func shutdownServer() {
    server := &http.Server{Addr: ":8080"}
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    if err := server.Shutdown(ctx); err != nil {
        log.Fatalf("Could not gracefully shutdown the server: %v\n", err)
    } else {
        log.Println("Server gracefully shut down")
    }
}

// 关闭浏览器
func closeBrowser() {
    var cmd *exec.Cmd

    switch runtime.GOOS {
    case "darwin":
        cmd = exec.Command("osascript", "-e", "tell application \"Safari\" to quit")
    case "linux":
        cmd = exec.Command("xdotool", "key", "Ctrl+Q")
    case "windows":
        cmd = exec.Command("taskkill", "/F", "/IM", "chrome.exe")
    default:
        log.Println("Unsupported OS")
        return
    }

    err := cmd.Run()
    if err != nil {
        log.Printf("Failed to close browser: %v", err)
    } else {
        log.Println("Browser closed")
    }
}

网线接法图解、水晶头接法图解

1、一种是直连互联法,一种是交叉互联法。交叉线的做法是:一头采用568A标准,一头采用568B标准;直连线的做法是:两头同为568A标准或568B标准。

2、
标准568A:绿白-1,绿-2,橙白-3,蓝-4,蓝白-5,橙-6,棕白-7,棕-8。
标准568B:橙白-1,橙-2,绿白-3,蓝-4,蓝白-5,绿-6,棕白-7,棕-8。

3、先用压线钳,将网线的胶皮剪掉约2厘米,露出8股内线。然后按照568A或者568B的标准线序把网线排列好,接着把8股线末端剪齐,将水晶头有塑料弹簧片的一端向下,有金属针脚的一端向上,把整齐的8股线插入水晶头,并使其紧紧的顶在顶端,最后把水晶头插入8P槽内,用力握紧压线钳即可。

export 声明用于从 JavaScript 模块中导出值。导出的值可通过 import 声明或动态导入来将其导入其他程序。导入绑定的值会在导出该绑定的模块中发生变化——当模块更新其导出绑定的值时,更新将在其导入值中可见。

- 阅读剩余部分 -