transport.go 797 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package net
  2. import (
  3. "io"
  4. )
  5. const (
  6. bufferSize = 32 * 1024
  7. )
  8. var (
  9. dirtyBuffers = make(chan []byte, 1024)
  10. )
  11. func getBuffer() []byte {
  12. var buffer []byte
  13. select {
  14. case buffer = <-dirtyBuffers:
  15. default:
  16. buffer = make([]byte, bufferSize)
  17. }
  18. return buffer
  19. }
  20. func putBuffer(buffer []byte) {
  21. select {
  22. case dirtyBuffers <- buffer:
  23. default:
  24. }
  25. }
  26. func ReaderToChan(stream chan<- []byte, reader io.Reader) error {
  27. for {
  28. buffer := getBuffer()
  29. nBytes, err := reader.Read(buffer)
  30. if nBytes > 0 {
  31. stream <- buffer[:nBytes]
  32. }
  33. if err != nil {
  34. return err
  35. }
  36. }
  37. return nil
  38. }
  39. func ChanToWriter(writer io.Writer, stream <-chan []byte) error {
  40. for buffer := range stream {
  41. _, err := writer.Write(buffer)
  42. putBuffer(buffer)
  43. if err != nil {
  44. return err
  45. }
  46. }
  47. return nil
  48. }