2017-07-03 12 views
0

私はTCP/IPソケットでC言語で作成したサーバー用のGolangクライアントを書き始めたばかりで、チャンネルが動作していないことが分かりました。TCP/IPソケットでGolangのチャンネルが動作しない

なぜでしょうか? http://pasted.co/a37b2954

しかし、私が唯一持っている:以下の出力でnetcatを結果と私のサーバーをテスト

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

http://pasted.co/f13d56b4

私はので、多分私が間違っているGolangにちゃんに新たなんだ(Iおそらくam)

+0

質問自体に「機能しない」と定義できますか? – Adrian

答えて

2

チャネルの使用率は問題ありませんが、チャネルから値を取得すると、改行を待ってから以前に読み取られた値が上書きされます(buf := <-read)。

また、bufio.Readerを使用して、文字列upto改行を読み取ることができます。

あなたのコードスニペットは、実行しようとすると、私に知らせてとてもその実行可能ではない部分である。

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:

データを読み取るために、一般的なTCPクライアントの例を見つけてください。 。また、上記のコードスニペットからスキャナを削除し、バッファーリーダーを追加しました。

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

期待する文字列の場合は、 'chan string'が好ましい。 – mattn

+0

@mattn良い提案、私はそれを更新します。 – jeevatkm

+0

ありがとうございました。コード全体がhtmlなどのガベージであり、判読不能です。 あなたのコードを使用していますが、何も生成されません。ファイルにメッセージがありません... –

関連する問題