dsjswclzh40259075 2015-12-28 09:38
浏览 26
已采纳

执行:服务器应阻塞,直到收到来自客户端的消息

I'm building some server/client application in Go (the language is new to me). I searched a lot and read a whole bunch of different examples but there is still one thing I can't find. Lets say I have a single server client up and running. The client will send some kind of a message to the server and vice versa. Encoding and decoding is done by the package gob.

This example is not my application, it is only a quick example:

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
", m.Sender, m.Receiver, m.Command, m.Value)
}

This works fine, but I want the server to block until a new message is received so I can put the receiving process inside a infinite for loop inside a goroutine.

Something like that:

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
", m.Sender, m.Receiver, m.Command, m.Value)
}
  • 写回答

2条回答 默认 最新

  • dsfd3546 2015-12-28 14:09
    关注

    The gob decoder blocks until it has read a full message or there's an error. The read loop in the question works as is.

    working example on the playground

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能