2017-07-03 2 views
0

Ich habe gerade angefangen zu schreiben einen Golang-Client für einen Server, den ich in C mit TCP/IP-Sockets gemacht habe, dann habe ich herausgefunden, dass mein Kanal nicht funktionierte.Kanäle in Golang mit TCP/IP-Socket funktioniert nicht

Irgendwelche Ideen warum?

func reader(r io.Reader, channel chan<- []byte) { 
    buf := make([]byte, 2048) 
    for { 
    n, err := r.Read(buf[:]) 
    if err != nil { 
     return 
    } 
    channel <- buf[0:n] 
    } 
} 
func client(e *gowd.Element) { 
f, err := os.Create("/tmp/dat2") 
if err != nil { 
    log.Fatal() 
} 
read := make(chan []byte) 
c, err := net.Dial("tcp", "127.0.0.1:4242") 
if err != nil { 
    log.Fatal(err) 
} 
go reader(c, read) 
for { 
    buf := <-read 
    n := strings.Index(string(buf), "\n") 
    if n == -1 { 
     continue 
} 
msg := string(buf[0:n]) 
if msg == "WELCOME" { 
    fmt.Fprint(c, "GRAPHIC\n") 
} 
f.WriteString(msg + "\n") 
} 

Testen meinem Server mit netcat Ergebnisse in der folgenden Ausgabe: http://pasted.co/a37b2954

Aber ich habe nur: http://pasted.co/f13d56b4

Ich bin neu zu chan in Golang so vielleicht bin ich falsch (I wahrscheinlich am)

+0

Können Sie in der Frage selbst "nicht funktionieren" definieren? – Adrian

Antwort

2

Die Kanalverwendung sieht gut aus, aber das Abrufen des Werts vom Kanal würde den zuvor gelesenen Wert unter buf := <-read seit dem Warten auf Newline überschreiben.

Sie können auch bufio.Reader verwenden, um die Zeichenfolge bis zu Newline zu lesen.

Ihr Code-Snippet ist teilweise so dass ihr nicht möglich auszuführen, versuchen Sie und lassen Sie mich wissen:

func reader(r io.Reader, channel chan<- string) { 
    bufReader := bufio.NewReader(conn) 
    for { 
     msg, err := bufReader.ReadString('\n') 
     if err != nil { // connection error or connection reset error, etc 
      break 
     } 
     channel <- msg 
    } 
} 

func client(e *gowd.Element) { 
    f, err := os.Create("/tmp/dat2") 
    if err != nil { 
     log.Fatal() 
    } 
    read := make(chan string) 
    c, err := net.Dial("tcp", "127.0.0.1:4242") 
    if err != nil { 
     log.Fatal(err) 
    } 
    go reader(c, read) 
    for { 
     msg := <-read 
     if msg == "WELCOME" { 
      fmt.Fprint(c, "GRAPHIC\n") 
     } 
     f.WriteString(msg + "\n") 
    } 
    //... 
} 

EDIT:

Bitte Beispiel von generischen TCP-Client finden, Daten zu lesen . Außerdem habe ich den Scanner vom obigen Code-Snippet entfernt und den Pufferleser hinzugefügt.

func main() { 
    conn, err := net.Dial("tcp", "127.0.0.1:4242") 
    if err != nil { 
     log.Fatal(err) 
    } 

    reader := bufio.NewReader(conn) 
    for { 
     msg, err := reader.ReadString('\n') 
     if err != nil { 
      break 
     } 
     fmt.Println(msg) 
    } 
} 
+0

Wenn String erwartet, bevorzugt er 'chan string'. – mattn

+0

@mattn Guter Vorschlag, ich werde es aktualisieren. – jeevatkm

+0

Danke, der ganze Code ist Müll mit HTML und was auch immer, unlesbar. Ich benutze Ihren Code, aber es produziert nichts, ich habe keine weitere Nachricht in meiner Datei ... –

Verwandte Themen