【问题标题】:Golang server, how to receive TCP JSON packet?Golang服务器,如何接收TCP JSON数据包?
【发布时间】:2015-07-23 06:50:19
【问题描述】:

我是 Golang 新手,我在这里使用“服务器”代码作为起点:http://www.golang-book.com/13/index.htm#section7

我尝试使用 JSON 而不是 Gob 解码(因为我需要用 C# 编写客户端),并且我正在与下面的代码分开的脚本中发送 JSON TCP 数据客户端数据。

我被困在我实际接收 JSON TCP 数据并将其存储在一个变量中以便对其进行解码的部分。看起来我可以用json.Unmarshal 对其进行解码,但我找不到任何使用json.Unmarshal 来解码TCP 数据的示例。我只能找到 json.Unmarshal 用于解码 JSON 字符串的示例。

我的代码如下:

package main

import (
  "encoding/json"
  "fmt"
  "net"
)

type coordinate struct {
  X float64 `json:"x"`
  Y float64 `json:"y"`
  Z float64 `json:"z"`
}

func server() {
  // listen on a port
  ln, err := net.Listen("tcp", ":9999")
  if err != nil {
    fmt.Println(err)
    return
  }
  for {
    // accept a connection
    c, err := ln.Accept()
    if err != nil {
      fmt.Println(err)
      continue
    }
    // handle the connection
    go handleServerConnection(c)
  }
}

func handleServerConnection(c net.Conn) {
  // receive the message
  var msg coordinate

卡在下面一行。我可以将 rawJSON 变量设置为等于什么?

  err := json.Unmarshal([]byte(rawJSON), &msg)
  if err != nil {
    fmt.Println(err)
  } else {
    fmt.Println("Received", msg)
  }

  c.Close()
}

func main() {
  go server()

  //let the server goroutine run forever
  var input string
  fmt.Scanln(&input)
}

【问题讨论】:

  • 你显然需要从连接中读取数据。您的客户将使用什么消息框架?
  • 是的,我正在尝试从连接中读取数据。这是我从客户端发送的代码(用 Ruby 编写)。 pastebin.com/vkUy0hta 我已经验证了 tcp 套接字已经建立并且 golang 服务器正在接收数据包。我只是不知道如何读取发送的实际数据并解码 JSON。
  • 为什么不直接使用 http 为您设置框架,并允许您访问任何您想要的客户端库?在每条消息后关闭连接将非常低效。
  • 糟糕,我没有意识到我在每条消息后都关闭了连接。我的目标是创建一个 MMORPG 游戏,其中客户端向服务器发送恒定的坐标/旋转 TCP 数据流,因此我认为 TCP 将是最好的协议。

标签: json sockets tcp go


【解决方案1】:

您可以将json.Decoder 直接修补到连接:

func handleServerConnection(c net.Conn) {

    // we create a decoder that reads directly from the socket
    d := json.NewDecoder(c)

    var msg coordinate

    err := d.Decode(&msg)
    fmt.Println(msg, err)

    c.Close()

}

【讨论】:

  • Decoder 可以读取多条消息,就像Encoder 写入多条消息一样。他们在对象之间使用简单的换行符。
  • 这个代码/解释对我有很大帮助,谢谢。我的目标是创建一个客户端,将在线游戏中的坐标发送到 Golang 服务器,所以我确实需要发送恒定的数据流。我会进一步研究 EOF,谢谢。
  • @jimb 谢谢,我不知道。当我不在手机上时,我会更改答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2015-08-28
  • 2015-05-18
相关资源
最近更新 更多