代码拉取完成,页面将自动刷新
package source
import (
"bufio"
"errors"
streams "gitee.com/qw_1215/glink"
"gitee.com/qw_1215/glink/flow"
"log"
"net"
)
// ConnType connection type
type ConnType string
const (
// TCP connection type
TCP ConnType = "tcp"
// UDP connection type
UDP ConnType = "udp"
)
// NetSource network socket connector
type NetSource struct {
conn net.Conn
listener net.Listener
connType ConnType
out chan interface{}
}
// NewNetSource creates a new NetSource
func NewNetSource(connType ConnType, address string) (*NetSource, error) {
var err error
var conn net.Conn
var listener net.Listener
out := make(chan interface{})
switch connType {
case TCP:
addr, _ := net.ResolveTCPAddr(string(connType), address)
listener, err = net.ListenTCP(string(connType), addr)
if err != nil {
log.Fatal(err)
return nil, err
}
go acceptConnections(listener, out)
case UDP:
addr, _ := net.ResolveUDPAddr(string(connType), address)
conn, err = net.ListenUDP(string(connType), addr)
if err != nil {
log.Fatal(err)
return nil, err
}
go handleConnection(conn, out)
default:
return nil, errors.New("Invalid connection type")
}
source := &NetSource{
conn: conn,
listener: listener,
connType: connType,
out: out,
}
return source, nil
}
// TCP Accept routine
func acceptConnections(listener net.Listener, out chan<- interface{}) {
for {
// accept new connection
conn, err := listener.Accept()
if err != nil {
log.Fatal(err)
}
// handle new connection
go handleConnection(conn, out)
}
log.Printf("Closing NetSource TCP listener %v", listener)
listener.Close()
}
// handleConnection routine
func handleConnection(conn net.Conn, out chan<- interface{}) {
log.Printf("NetSource connected on: %v", conn.LocalAddr())
reader := bufio.NewReader(conn)
for {
bufferBytes, err := reader.ReadBytes('\n')
if err != nil {
log.Fatal(err)
break
} else {
out <- string(bufferBytes)
}
}
log.Printf("Closing NetSource connection %v", conn)
_ = conn.Close()
}
// Via streams data through given flow
func (ns *NetSource) Via(_flow streams.Flow) streams.Flow {
flow.DoStream(ns, _flow)
return _flow
}
// Out returns channel for sending data
func (ns *NetSource) Out() <-chan interface{} {
return ns.out
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。