我正在学习 Golang 几天,所以我不清楚如何在函数内检索正确的连接“conn”
函数处理消息
对于相关消息“msg”
谢谢!
package main
import (
"fmt"
"log"
"net"
"os"
"encoding/json"
"time"
"bufio"
)
type Packet struct {
Payload Payload `json:"payload"`
}
type Payload struct {
Data string `json:"data"`
}
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s hostname\n", os.Args[0])
fmt.Println("Usage: ", os.Args[0], "port number")
os.Exit(1)
}
msgchan := make(chan string)
go processMessages(msgchan)
addr := ":" + os.Args[1]
ln, err := net.Listen("tcp", addr)
if err != nil {
fmt.Println(err)
//log.Fatal(err)
}
fmt.Println("Server listening at ", addr)
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
/* FIRST GOROUTINE */
go handleConnection(conn, msgchan)
}
}
func processMessages(msgchan <-chan string) {
for msg := range msgchan {
/*
.. here the problem.. how I can know here the 'conn' the relative connection for this message???
*/
if len(msg)>0 {
packet := &Packet{}
err := json.Unmarshal([]byte(msg), packet)
if err != nil {
log.Fatalln("Error xxx: ", err)
} else {
if len(packet.Payload.Data) > 0 {
fmt.Println( len(packet.Payload.Data) )
}
}
}
}
}
func closeConnection(c net.Conn) {
c.Close()
}
func handleConnection(c net.Conn, msgchan chan<- string) {
for {
inputReader := bufio.NewReader(c)
o, _ := inputReader.ReadString('\n')
msgchan <- o
}
}
在函数 func handleConnection 中,我有连接,但是..如何将连接与消息“<- o”一起转发到 channel “msgchan”???
瓦莱里诺·科苏
最佳答案
只需提供适合用途的 channel 类型即可
type Msg struct {
Msg string
Conn *net.Conn
}
type MsgChan chan Msg
func handleConnection(c net.Conn, msgchan MsgChan) {
//...
msgchan <- Msg{Msg: o, Conn: &c}
//...
}
func processMessages(msgchan <-chan Msg) {
for msg := range msgchan {
m := msg.Msg
conn := nsg.Conn
//...
}
关于sockets - 检索确切的连接 - tcp 套接字 - channel - goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420210/