2016-09-09 5 views
0

Я учусь Golang на несколько дней, так что мне не ясно, как получить правильное соединение «Конн» внутри функцииполучить точное соединение - TCP сокетов - канал - goroutine

функ processMessages

для относительного сообщения "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 у меня есть связь, но .. как направить подключение к каналу «msgchan» вместе с сообщением «< - о» ???

Valeriano 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

решения, которые мне нужны, спасибо много! Большой! ciao Увеличитель – internet3

Смежные вопросы