2017-07-03 8 views
0

Je viens de commencer à écrire un client Golang pour un serveur que j'ai fait en C avec des sockets TCP/IP, puis j'ai compris que ma chaîne ne fonctionnait pas.Les canaux dans Golang avec socket TCP/IP ne fonctionnent pas

Des idées pourquoi?

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") 
} 

Test mon serveur avec des résultats netcat dans la sortie suivante: http://pasted.co/a37b2954

Mais je ne dispose que: http://pasted.co/f13d56b4

Je suis nouveau chan golang alors peut-être que je me trompe (je probablement am)

+0

Pouvez-vous définir «ne fonctionne pas» dans la question elle-même? – Adrian

Répondre

2

L'utilisation du canal semble correcte, mais l'extraction de la valeur du canal écraserait la valeur lue précédemment à buf := <-read depuis votre attente de retour à la ligne.

Vous pouvez également utiliser bufio.Reader pour lire la chaîne jusqu'à newline.

Votre extrait de code est si ce ne est pas possible d'exécuter partielle, essayer de me faire savoir:

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:

S'il vous plaît trouver exemple de client TCP générique pour lire les données . J'ai également retiré le scanner de l'extrait de code ci-dessus et ajouté un lecteur de tampon.

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

si attendre chaîne, il préfère 'chan string'. – mattn

+0

@mattn Bonne suggestion, je vais le mettre à jour. – jeevatkm

+0

Merci, tout le code est garbage avec html et tout, illisible. J'utilise votre code, mais il ne produit rien, je n'ai plus de message dans mon dossier ... –