2017-10-05 37 views
3

私は新しいです。私はC#でコーディングしていますが、私はサーバーも必要です。golang net.Connには利用可能なデータがありません

func ServeToClient(client net.Conn) { 
for { 
    fmt.Fprintln(client,"Serving you!") 
    buffer:=make([]byte,1024) 
    _, err :=bufio.NewReader(client).Read(buffer) 
    if err!=nil{ 
     fmt.Println(err) 
     client.Close() 
     fmt.Println("Disconnected duet to the error: ",err.Error()) 
     return 
    } 
    data := string(buffer) 
    fmt.Println(data) 
    command := data[0:2] 
    i,err := strconv.Atoi(command) 
    if err!=nil { 
     fmt.Println(err) 
     return 
    } 
} 

をしかし、それはようdataを見ている:だから私は、サーバーを書かれている

{ "ID": "009"、 "ユーザ名": "不器用者"} ?????? ???????????????????????????????????????????????????????? ???????????????????????????????????????????????????????? ???????????????????????

そして、私はそれがバイト長のバイト配列(それは1024の長さである)を超過しているためだと思います。適切に私のバイト配列を作成するためのプロパティ(C# Socket.Availabeのような)はありますか?あなたは、この行に、変数バッファに読み込まれたバイト数を無視しているRead()によると

+0

バイト読み込み*の数、つまり 'Read'メソッドの最初の戻り値を無視してはいけません。ネットワーク通信では、通常、チャンクでデータチャンクを読み取ってから、それらを結合してバイトストリーム全体を取得する必要があります。データがJSON形式の場合は、['json.Decoder'](https:// golang。org/pkg/encoding/json /#NewDecoder)、すなわち 'decoder:= json.NewDecoder(client)'を実行し、 'decoder.Decode(&obj)'でオブジェクトを取得します。 – putu

+0

Yeap。見つけた。 – Bungler

答えて

2

_, err := bufio.NewReader(client).Read(buffer)

ちょうどバイトの新たな変数N格納するための番号を追加します。

n, err := bufio.NewReader(client).Read(buffer)

、その後、あなただけの、その番号を取ることができます

data := string(buffer[:n])

編集:

他の代替:json.NewDecoder(client).Decode(&pointer_to_struct_or_map)

  • あなたはこのようなDecoder何かJSONを使用することができます1024の長さを持っているあなたのバッファからのバイト
  • ioutil.ReadAll(client)
  • Bufferにそれぞれ1024のバイトを保存し、その後、あなたはYandryポゾの答えに追加Bytes()
+1

Yeap、私の場合の解決策ですが、データが1024より大きい場合はどうなりますか?私はそれを処理できませんか? – Bungler

+0

いいえ、あなたは最初の1024バイトしか読まないでしょう。そのためには、[ioutil.ReadAll()](https://golang.org/pkg/io/ioutil/#ReadAll)を使うか、それともforループでは1024バイトごとに読み込み、[Buffer](https://golang.org/pkg/bytes/#NewBuffer)に書き込んだり、forループの外側でBytes()やString ) –

+0

ありがとう!よく働く。私もそれを試みます。 – Bungler

0

を使用することができます:n以上1024可能性または多分あなたはReadに1回の呼び出しでメッセージ全体を得ることはありません。 (可能なすべてのネットワーク上で)

信頼できる通信プロトコルを取得するには、受信者がメッセージが完全であると判断できるメッセージフォーマットを定義する必要があります。

たとえば、単純なフレーミング形式を使用して、最初の4バイトにメッセージの長さを送信できます。その後、4バイトを取得してからReadを繰り返し呼び出すまで、メッセージ全体を読むまで読むことができます。

+0

清潔で効率的な回答です。役立ちました。みんな、ありがとう。 – Bungler

関連する問題