2017-08-10 5 views
1

ストリーム上で複数のオブジェクトをエンコードして送信しています。私は以下のコードに示すようにそれらをデコードし、接続を開いたままにします。私は、最初の後にすべてのオブジェクトのデコードで "バッファの余分なデータ"エラーが発生しています。golangでゴブを解読しようとすると「バッファに余分なデータがあります」というエラーが発生する

func handleAggregatorConnection(conn net.Conn) { 
     var connectionNumber = connectionCount 
     connectionCount += 1 
     log.Println("connection event: starting handle aggregator connection") 


     dec := gob.NewDecoder(conn) 

     var colorArrays map[string][]string 
     colorArrayValue := &colorArrays 

     var i P 
     ai := &i 


     for { 
       //err := dec.Decode(colorArrayValue) 
       err := dec.Decode(ai) 
       if err == nil { 
         receivedColorResultFromAggregator = true 
         //log.Printf("received : %+v", colorArrayValue) 
         log.Println("received:", i) 
         aggregatorResultMap[connectionNumber] = *colorArrayValue 
         log.Println("control server: received object from aggregator ", aggregatorR\ 
esultMap) 
       } else if err == io.EOF { 
         log.Println("reached end of stream while" + 
           "listening to aggregator") 
         delete(aggregatorResultMap, connectionNumber) 
         break 
       } else { 
         log.Println("error decoding:", err) 
         break 
       } 
     } 
     log.Println("connection event: closing aggregator connection") 
     conn.Close() 
} 
+0

エラーを再現しようとすると、intのようなものを繰り返し送信することは実際には機能し、エラーは表示されないことに注意してください。構造体とマップを試してみたところ、エラーが発生します。 –

答えて

0

私自身の質問に答える:各デコード操作のために新しいデコーダを作成すると機能します。

func handleAggregatorConnection(conn net.Conn) { 
     var connectionNumber = connectionCount 
     connectionCount += 1 
     log.Println("connection event: starting handle aggregator connection") 

     for { 

       dec := gob.NewDecoder(conn) 

       var colorArrays map[string][]string 
       colorArrayValue := &colorArrays 

       var i P 
       ai := &i 



       //err := dec.Decode(colorArrayValue) 
       err := dec.Decode(ai) 
       if err == nil { 
         receivedColorResultFromAggregator = true 
         //log.Printf("received : %+v", colorArrayValue) 
         log.Println("received:", i) 
         aggregatorResultMap[connectionNumber] = *colorArrayValue 
         log.Println("control server: received object from aggregator ", aggregatorR\ 
esultMap) 
       } else if err == io.EOF { 
         log.Println("reached end of stream while" + 
           "listening to aggregator") 
         delete(aggregatorResultMap, connectionNumber) 
         break 
       } else { 
         log.Println("error decoding:", err) 
         break 
       } 
     } 
     log.Println("connection event: closing aggregator connection") 
     conn.Close() 
} 
1

私はあなたの答えを同意しない、私は自分自身がゴブリーダーやったその方法:

func GetAll(db string) ([]*Record, error) { 
    r := []*Record{} 

    f, err := os.OpenFile(db, os.O_RDONLY, 0644) 
    if err != nil { 
     return nil, err 
    } 

    var rr error 
    gdec := gob.NewDecoder(f) 
    for rr != io.EOF { 
     rec := Record{} 
     rr = gdec.Decode(&rec) 
     if rr != nil { 
      continue 
     } 
     r = append(r, &rec) 
    } 

    return r, nil 
} 

そしてexepectedとして、それは動作します。

IMHOの場合、エラーが表示された場合は「中断」しないでください。データを読み続ける必要があります。

関連する問題