sockets - 检索确切的连接 - tcp 套接字 - channel - goroutine

标签 sockets go tcp channel goroutine

我正在学习 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/

相关文章:

go - 发送 JSON 请求以测试 beego 中的端点 API 失败,正文为空

go - 如何从golang中的base64编码文件中提取文件扩展名?

C pthreads send()ing 和 recv()ing 在套接字上。分开工作但没有一起工作。不会退出

qt - 这两种OpenSSL生成方式的区别

java - 在将大文件发送到多个客户端的同时提高性能

networking - TCP Reno 中的慢启动阈值

networking - 使用状态机的网络服务器/客户端的通用架构

c# - 发送比发送缓冲区中可以存储的数据更多的数据

go - 在 Go 中扫描向上和向下箭头?

ruby - Ruby 可以处理多少个 TCP 连接?