2016-09-09 3 views
0
나는 며칠에 의해 Golang을 배우고

정확한 연결 검색이 나에게 분명하지 않다, 그래서 어떻게 함수 내에서 "코네티컷"올바른 연결을 검색</p> <p>FUNC의 processMessages하는, goroutine

상대적 메시지 "msg"

감사! "< - O"I가 연결되어 기능 FUNC의 내부 handleConnection

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 
    } 

} 

있지만 방법 .. 채널 메시지와 함께 "msgchan"연결을 전달하기 ???

발레리 COSSU는

답변

0

그냥 목적

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 
//... 
} 
+0

내가 필요로하는 솔루션에 적합한 유형의 채널, 덕분에 많이 제공! 큰! 카오 우 블리 치텔 – internet3