1 Star 0 Fork 0

qw_1215/glink

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
net.go 2.24 KB
一键复制 编辑 原始数据 按行查看 历史
qw_1215 提交于 2020-03-12 22:26 +08:00 . 项目初始化
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
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/qw_1215/glink.git
git@gitee.com:qw_1215/glink.git
qw_1215
glink
glink
195e12e86392

搜索帮助