【发布时间】:2015-12-28 09:38:17
【问题描述】:
我正在Go 中构建一些服务器/客户端应用程序(该语言对我来说是新的)。我进行了很多搜索并阅读了一大堆不同的示例,但仍有一件事我找不到。可以说我有一个服务器客户端启动并运行。客户端将向服务器发送某种消息,反之亦然。编解码由包gob完成。
这个例子不是我的应用,它只是一个简单的例子:
package main
import (
"bytes"
"encoding/gob"
"fmt"
"log"
)
type Message struct {
Sender string
Receiver string
Command uint8
Value int64
}
func (message *Message) Set(sender string, receiver string, command uint8, value int64) *Message {
message.Sender = sender
message.Receiver = receiver
message.Command = command
message.Value = value
return message
}
func main() {
var network bytes.Buffer // Stand-in for a network connection
enc := gob.NewEncoder(&network) // Will write to network.
dec := gob.NewDecoder(&network) // Will read from network.
message := new(Message).Set("first", "second", 10, -1)
err := enc.Encode(*message) // send message
if err != nil {
log.Fatal("encode error:", err)
}
var m Message
err = dec.Decode(&m) // receice message
if err != nil {
log.Fatal("decode error:", err)
}
fmt.Printf("%q %q %d %d\n", m.Sender, m.Receiver, m.Command, m.Value)
}
这很好用,但我希望服务器在收到新消息之前一直阻塞,这样我就可以将接收进程放入 infinite for loop 内 goroutine 内。
类似的东西:
for {
// The server blocks HERE until a message from the client is received
fmt.Println("Received message:")
// Decode the new message
var m Message
err = dec.Decode(&m) // receice message
if err != nil {
log.Fatal("decode error:", err)
}
fmt.Printf("%q %q %d %d\n", m.Sender, m.Receiver, m.Command, m.Value)
}
【问题讨论】:
-
那么问题是如何与golang建立网络连接?
-
不,问题是如何在解码连接缓冲区之前等待消息。在 golang 中很容易设置 TCP 服务器,但我不知道如何在一侧阻止消息接收过程,因此上面的 for 循环不会打印数千个错误,直到它在
net.Conn上找到新消息。 -
假设来自客户端的消息何时到达是未知的,因此服务器将阻塞并在 goroutine 内等待新消息,但我不知道如何实现这一点。