2014-04-17 12 views
8

Hallo, ich bin versucht, eine Socket-Programmierung in golang zu lernen, ich bin nach zusammen mit diesem Tutorialein TCP-Client in golang Erstellen

http://synflood.at/tmp/golang-slides/mrmcd2012.html#1

Hier ist das Endergebnis des Tutorials auf den einer Seite .

Ich bin verwirrt auf, wie man die Klientenseite dieses Programms schreibt, ich stelle eine Verbindung her und wähle in den gleichen Hafen/ip, wie der Server läuft, aber von dort weiß ich nicht. Ich habe gelesen() und write() Funktionen für die neu erstellte Verbindung, aber keine Ahnung, wo das Lesen oder irgendetwas zu begrenzen. Wenn man bedenkt, dass die Texteingabe im Server verarbeitet wird, stelle ich mir vor, dass ich nur etwas lesen müsste.

package main 

import (
    "bufio" 
    "fmt" 
    "net" 
    "os" 
) 

func main() { 
    conn, err := net.Dial("tcp", "127.0.0.1:6000") 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 

    for { 
     fmt.Println(bufio.NewReader(conn).ReadString([]byte("\n"))) 
    } 

} 
+0

TCP ist ein Peer-to-Peer-Protokoll, und es hat keine Clients oder Server. Das Client/Server-Konzept ist ein Anwendungskonzept, das nichts mit TCP zu tun hat. –

Antwort

11

bufio.NewReader sollte nur einmal in Ihrem Fall verwendet werden, kurz vor dem for. Zum Beispiel connbuf := bufio.NewReader(conn). Dann können Sie ReadString für connbuf verwenden, das die Zeichenfolge und möglicherweise einen Fehler zurückgibt. Zum Beispiel:

connbuf := bufio.NewReader(conn) 
for{ 
    str, err := connbuf.ReadString('\n') 
    if len(str)>0 { 
     fmt.Println(str) 
    } 
    if err!= nil { 
     break 
    } 
} 

Ich überprüfe len und err weil ReadString Daten zurückgeben kann und einen Fehler (Verbindungsfehler, Verbindung zurückgesetzt, etc.), so müssen Sie beide überprüfen.

+0

Dies funktioniert, um zur ersten Eingabeaufforderung zu gelangen, aber wenn der Server (wie ich annehme) "bufc.ReadLine()" ausführt, kann ich nichts eingeben. Dies ist die Ausgabe, die ich 'Welcome to chat room, Was ist Ihr Spitzname?:' Aber es hängt hier nicht erlaubt Eingabe. – user3324984

+0

Ja, natürlich. Es liest und druckt weiter. Wenn Sie etwas Interaktivität benötigen, können Sie entweder die Schleife stoppen, wenn Sie die Eingabeaufforderung erkennen, oder mit Hilfe von Gordoutinen, eine zum Lesen und eine weitere zum Schreiben. – siritinga

+1

Wenn ich verstehe, was Sie wollen, können Sie zwei Verbindungen verwenden, nachdem die Verbindung hergestellt wurde. Eins zum Lesen vom Server, einfach "io.Copy (os.Stdout, conn)" und anderes für die andere Richtung mit "io.Copy (conn, os.Stdin)" verwenden. Dies ist völlig asynchron, aber es sollte genug sein, um loszulegen. – siritinga

0

Hier ist eine einfache Lösung, wenn Sie alle empfangenen Daten lesen möchten.

connbuf := bufio.NewReader(c.m_socket) 
    // Read the first byte and set the underlying buffer 
    b, _ := connbuf.ReadByte() 
    if connbuf.Buffered() > 0 { 
     var msgData []byte 
     msgData = append(msgData, b) 
     for connbuf.Buffered() > 0 { 
      // read byte by byte until the buffered data is not empty 
      b, err := connbuf.ReadByte() 
      if err == nil { 
       msgData = append(msgData, b) 
      } else { 
       log.Println("-------> unreadable caracter...", b) 
      } 
     } 
     // msgData now contain the buffered data... 
    }