connector.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package mhayaConnector
  2. import (
  3. "crypto/tls"
  4. "net"
  5. cfacade "github.com/mhaya/facade"
  6. clog "github.com/mhaya/logger"
  7. )
  8. type (
  9. Connector struct {
  10. listener net.Listener
  11. onConnectFunc cfacade.OnConnectFunc
  12. connChan chan net.Conn
  13. running bool
  14. }
  15. )
  16. func NewConnector(size int) Connector {
  17. connector := Connector{
  18. connChan: make(chan net.Conn, size),
  19. running: true,
  20. }
  21. return connector
  22. }
  23. func (p *Connector) OnConnect(fn cfacade.OnConnectFunc) {
  24. if fn != nil {
  25. p.onConnectFunc = fn
  26. }
  27. }
  28. func (p *Connector) InChan(conn net.Conn) {
  29. p.connChan <- conn
  30. }
  31. func (p *Connector) Start() {
  32. if p.onConnectFunc == nil {
  33. panic("onConnectFunc is nil.")
  34. }
  35. go func() {
  36. for conn := range p.connChan {
  37. p.onConnectFunc(conn)
  38. }
  39. }()
  40. }
  41. func (p *Connector) Stop() {
  42. p.running = false
  43. if err := p.listener.Close(); err != nil {
  44. clog.Errorf("Failed to stop: %s", err)
  45. }
  46. }
  47. func (p *Connector) Running() bool {
  48. return p.running
  49. }
  50. func (p *Connector) GetListener(certFile, keyFile, address string) (net.Listener, error) {
  51. var err error
  52. if certFile == "" || keyFile == "" {
  53. p.listener, err = net.Listen("tcp", address)
  54. return p.listener, err
  55. }
  56. crt, err := tls.LoadX509KeyPair(certFile, keyFile)
  57. if err != nil {
  58. clog.Fatalf("failed to listen: %s", err.Error())
  59. }
  60. tlsCfg := &tls.Config{
  61. Certificates: []tls.Certificate{crt},
  62. }
  63. p.listener, err = tls.Listen("tcp", address, tlsCfg)
  64. return p.listener, err
  65. }