transport.go 840 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 := make([]byte, bufferSize)
  29. //buffer := getBuffer()
  30. nBytes, err := reader.Read(buffer)
  31. if nBytes > 0 {
  32. stream <- buffer[:nBytes]
  33. }
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. return nil
  39. }
  40. func ChanToWriter(writer io.Writer, stream <-chan []byte) error {
  41. for buffer := range stream {
  42. _, err := writer.Write(buffer)
  43. //putBuffer(buffer)
  44. if err != nil {
  45. return err
  46. }
  47. }
  48. return nil
  49. }