Go Client Connect to an URL with Socket

huangapple go评论128阅读模式
英文:

Go Client Connect to an URL with Socket

问题

我是你的中文翻译助手,以下是翻译好的内容:

我是Go的新手。我有一个运行FastAPI Python的服务器。我已经在127.0.0.1:8000/register上运行了WebSocket请求。

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

我想创建一个作为客户端的应用程序,使用Go语言连接到这个URL并发送信息以创建账户。但是当我尝试在Google上使用示例代码时,出现了以下错误:

  1. package main
  2. import (
  3. "net"
  4. "fmt"
  5. "bufio"
  6. "os"
  7. "log"
  8. )
  9. func main() {
  10. // 连接服务器
  11. conn, err := net.Dial("tcp", "127.0.0.1:8000/register")
  12. if err != nil {
  13. log.Println(err)
  14. }
  15. for {
  16. // 要发送什么?
  17. reader := bufio.NewReader(os.Stdin)
  18. fmt.Print("Text to send: ")
  19. text, err := reader.ReadString('\n')
  20. if err != nil {
  21. log.Println(err)
  22. }
  23. // 发送到服务器
  24. fmt.Fprintf(conn, text + "\n")
  25. // 等待回复
  26. message, err := bufio.NewReader(conn).ReadString('\n')
  27. if err != nil {
  28. log.Println(err)
  29. }
  30. fmt.Print("Message from server: " + message)
  31. }
  32. }

由于dial tcp: lookup tcp/8000/register: getaddrinfow: The specified class was not found,它无法正常工作。

据我了解,它无法查找此链接,它只能在IP地址时进行查找。我该如何创建一个到URL的Socket请求?

英文:

I'm newbie in Go. I have a server run FastAPI Python. I have already run websocket request in 127.0.0.1:8000/register.

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

I want to create an app work as a client by Go. This app use socket connect to this URL and send info to create account. But when I try to use example code in google:

  1. package main
  2. import "net"
  3. import "fmt"
  4. import "bufio"
  5. import "os"
  6. import "log"
  7. func main() {
  8. // connect to server
  9. conn, err := net.Dial("tcp", "127.0.0.1:8000/register")
  10. if err != nil {
  11. log.Println(err)
  12. }
  13. for {
  14. // what to send?
  15. reader := bufio.NewReader(os.Stdin)
  16. fmt.Print("Text to send: ")
  17. text, err := reader.ReadString('\n')
  18. if err != nil {
  19. log.Println(err)
  20. }
  21. // send to server
  22. fmt.Fprintf(conn, text + "\n")
  23. // wait for reply
  24. message, err := bufio.NewReader(conn).ReadString('\n')
  25. if err != nil {
  26. log.Println(err)
  27. }
  28. fmt.Print("Message from server: "+message)
  29. }
  30. }

It's not working because of dial tcp: lookup tcp/8000/register: getaddrinfow: The specified class was not found

As I understand that it cannot lookup for this link, it only lookups when it's a IP Address.
How can I create a Socket request to an URL?

答案1

得分: 1

使用github.com/gorilla/websocket包可以在Go语言中实现WebSocket功能。下面是一个示例代码:

  1. package main
  2. import (
  3. "flag"
  4. "log"
  5. "net/url"
  6. "os"
  7. "os/signal"
  8. "time"
  9. "github.com/gorilla/websocket"
  10. )
  11. var addr = flag.String("addr", "127.0.0.1:8080", "http service address")
  12. func main() {
  13. flag.Parse()
  14. log.SetFlags(0)
  15. interrupt := make(chan os.Signal, 1)
  16. signal.Notify(interrupt, os.Interrupt)
  17. u := url.URL{Scheme: "ws", Host: *addr, Path: "/register"}
  18. log.Printf("connecting to %s", u.String())
  19. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  20. if err != nil {
  21. log.Fatal("dial:", err)
  22. }
  23. defer c.Close()
  24. done := make(chan struct{})
  25. go func() {
  26. defer close(done)
  27. for {
  28. _, message, err := c.ReadMessage()
  29. if err != nil {
  30. log.Println("read:", err)
  31. return
  32. }
  33. log.Printf("recv: %s", message)
  34. }
  35. }()
  36. ticker := time.NewTicker(time.Second)
  37. defer ticker.Stop()
  38. for {
  39. select {
  40. case <-done:
  41. return
  42. case t := <-ticker.C:
  43. err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
  44. if err != nil {
  45. log.Println("write:", err)
  46. return
  47. }
  48. case <-interrupt:
  49. log.Println("interrupt")
  50. // Cleanly close the connection by sending a close message and then
  51. // waiting (with timeout) for the server to close the connection.
  52. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
  53. if err != nil {
  54. log.Println("write close:", err)
  55. return
  56. }
  57. select {
  58. case <-done:
  59. case <-time.After(time.Second):
  60. }
  61. return
  62. }
  63. }
  64. }

另外,nhooyr.io/websocket是一个用于Go语言的最小化和符合惯例的WebSocket库。以下是一个示例代码:

  1. ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  2. defer cancel()
  3. c, _, err := websocket.Dial(ctx, "ws://localhost:8080/register", nil)
  4. if err != nil {
  5. // ...
  6. }
  7. defer c.Close(websocket.StatusInternalError, "the sky is falling")

你可以在https://github.com/nhooyr/websocket上找到更多关于nhooyr.io/websocket的信息。

英文:

use github.com/gorilla/websocket
example:

  1. package main
  2. import (
  3. &quot;flag&quot;
  4. &quot;log&quot;
  5. &quot;net/url&quot;
  6. &quot;os&quot;
  7. &quot;os/signal&quot;
  8. &quot;time&quot;
  9. &quot;github.com/gorilla/websocket&quot;
  10. )
  11. var addr = flag.String(&quot;addr&quot;, &quot;127.0.0.1:8080&quot;, &quot;http service address&quot;)
  12. func main() {
  13. flag.Parse()
  14. log.SetFlags(0)
  15. interrupt := make(chan os.Signal, 1)
  16. signal.Notify(interrupt, os.Interrupt)
  17. u := url.URL{Scheme: &quot;ws&quot;, Host: *addr, Path: &quot;/register&quot;}
  18. log.Printf(&quot;connecting to %s&quot;, u.String())
  19. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  20. if err != nil {
  21. log.Fatal(&quot;dial:&quot;, err)
  22. }
  23. defer c.Close()
  24. done := make(chan struct{})
  25. go func() {
  26. defer close(done)
  27. for {
  28. _, message, err := c.ReadMessage()
  29. if err != nil {
  30. log.Println(&quot;read:&quot;, err)
  31. return
  32. }
  33. log.Printf(&quot;recv: %s&quot;, message)
  34. }
  35. }()
  36. ticker := time.NewTicker(time.Second)
  37. defer ticker.Stop()
  38. for {
  39. select {
  40. case &lt;-done:
  41. return
  42. case t := &lt;-ticker.C:
  43. err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
  44. if err != nil {
  45. log.Println(&quot;write:&quot;, err)
  46. return
  47. }
  48. case &lt;-interrupt:
  49. log.Println(&quot;interrupt&quot;)
  50. // Cleanly close the connection by sending a close message and then
  51. // waiting (with timeout) for the server to close the connection.
  52. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, &quot;&quot;))
  53. if err != nil {
  54. log.Println(&quot;write close:&quot;, err)
  55. return
  56. }
  57. select {
  58. case &lt;-done:
  59. case &lt;-time.After(time.Second):
  60. }
  61. return
  62. }
  63. }
  64. }

or nhooyr.io/websocket - is a minimal and idiomatic WebSocket library for Go
https://github.com/nhooyr/websocket

  1. ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
  2. defer cancel()
  3. c, _, err := websocket.Dial(ctx, &quot;ws://localhost:8080/register&quot;, nil)
  4. if err != nil {
  5. // ...
  6. }
  7. defer c.Close(websocket.StatusInternalError, &quot;the sky is falling&quot;)

huangapple
  • 本文由 发表于 2021年10月21日 10:22:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/69655088.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定