【问题标题】:Go Client Connect to an URL with SocketGo Client 使用 Socket 连接到 URL
【发布时间】:2021-12-07 19:29:17
【问题描述】:

我是围棋新手。我有一台运行 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 并发送信息来创建帐户。但是当我尝试在谷歌中使用示例代码时:

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,它无法正常工作

据我了解,它无法查找此链接,它仅在它是 IP 地址时查找。 如何创建对 URL 的 Socket 请求?

【问题讨论】:

    标签: python sockets go websocket fastapi


    【解决方案1】:

    使用 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 的最小且惯用的 WebSocket 库 https://github.com/nhooyr/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")
    
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。
    猜你喜欢
    • 2015-04-06
    • 2014-02-15
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2019-04-09
    相关资源
    最近更新 更多