簡體   English   中英

Go Client 使用 Socket 連接到 URL

[英]Go Client Connect to an URL with Socket

我是 Go 的新手。 我有一台運行 FastAPI Python 的服務器。 我已經在127.0.0.1:8000/register 中運行了 websocket 請求。

@app.websocket("/register")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")

我想通過 Go 創建一個作為客戶端工作的應用程序。 此應用程序使用套接字連接到此 URL 並發送信息以創建帳戶。 但是當我嘗試在 google 中使用示例代碼時:

package main

import "net"
import "fmt"
import "bufio"
import "os"
import "log"

func main() {
  // connect to server
  conn, err := net.Dial("tcp", "127.0.0.1:8000/register")
  if err != nil {
    log.Println(err)
}
  for { 
    // what to send?
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Text to send: ")
    text, err := reader.ReadString('\n')
    if err != nil {
        log.Println(err)
    }
    // send to server
    fmt.Fprintf(conn, text + "\n")
    // wait for reply
    message, err := bufio.NewReader(conn).ReadString('\n')
    if err != nil {
        log.Println(err)
    }
    fmt.Print("Message from server: "+message)
  }
}

由於dial tcp: lookup tcp/8000/register: getaddrinfow: The specified class was not found無法正常工作dial tcp: lookup tcp/8000/register: getaddrinfow: The specified class was not found

據我所知,它無法查找此鏈接,它只會在它是 IP 地址時查找。 如何創建對 URL 的 Socket 請求?

使用 github.com/gorilla/websocket 示例:

package main

import (
    "flag"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"

    "github.com/gorilla/websocket"
)

var addr = flag.String("addr", "127.0.0.1:8080", "http service address")

func main() {
    flag.Parse()
    log.SetFlags(0)

    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    u := url.URL{Scheme: "ws", Host: *addr, Path: "/register"}
    log.Printf("connecting to %s", u.String())

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    done := make(chan struct{})

    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("recv: %s", message)
        }
    }()

    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()

    for {
        select {
        case <-done:
            return
        case t := <-ticker.C:
            err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")

            // Cleanly close the connection by sending a close message and then
            // waiting (with timeout) for the server to close the connection.
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            return
        }
    }
}

或 nhooyr.io/websocket - 是用於 Go https://github.com/nhooyr/websocket的最小且慣用的 WebSocket 庫

ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

c, _, err := websocket.Dial(ctx, "ws://localhost:8080/register", nil)
if err != nil {
    // ...
}
defer c.Close(websocket.StatusInternalError, "the sky is falling")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM