2

ここにこのコードがあります

https://gist.github.com/ChasingLogic/8324442

Golang を使用してネットワーク プログラミングを学ぼうとしていますが、これは同時実行の最初の試みであり、目標は、メッセージが送信され、接続されているすべてのクライアントにエコーされる IRC サーバーを簡素化することと同等です。

何らかの理由で、私のコードはチャネルにデータを送信することはありません。エラーチェックを入れると、EOFが無限に吐き出されます。

4

1 に答える 1

3

2 つの問題があります。

  1. handleClient の空の buf
  2. 送信者と受信者の間のデッドロック

1 つ目は簡単です。「var buf []byte」の代わりに「buf := make([]byte, 1024)」を使用するだけです。

2枚目は詳しく。

あなたが持っているhandleClientで

fmt.Println(string(buf[0:n]))
mesg <- buf[0:n]
fmt.Println(mesg)
ind <- n 
fmt.Println(ind)

したがって、最初にメッセージを送信してから、メッセージの長さを送信します。しかし、受信側には次のものがあります。

n := <-ind
fmt.Println("N recieved")
buf := <-mesg
fmt.Println("Channels recieved")

したがって、メッセージ自体の前にメッセージの長さを期待します。したがって、デッドロックが発生します。送信者はメッセージの長さを送信する前に誰かがメッセージを受信するのを待っていますが、受信者はメッセージを受信する前にメッセージの長さを受信するのを待っています。

handleClient を逆の順序に変更するだけで機能します。

fmt.Println(string(buf[0:n]))
ind <- n
mesg <- buf[0:n]
fmt.Println(mesg)
fmt.Println(ind)
于 2014-01-08T22:11:27.620 に答える