package main
import (
"context"
"fmt"
"log"
"time"
"github.com/cloudwego/netpoll"
)
func main() {
network, address := "tcp", "127.0.0.1:8888"
// 创建 listener
listener, err := netpoll.CreateListener(network, address)
if err != nil {
panic("create netpoll listener fail")
}
// handle: 连接读数据和处理逻辑
var onRequest netpoll.OnRequest = handler
// options: EventLoop 初始化自定义配置项
var opts = []netpoll.Option{
netpoll.WithReadTimeout(5 * time.Second),
netpoll.WithIdleTimeout(10 * time.Minute),
netpoll.WithOnPrepare(nil),
}
// 创建 EventLoop
eventLoop, err := netpoll.NewEventLoop(onRequest, opts...)
if err != nil {
panic("create netpoll event-loop fail")
}
// 运行 Server
err = eventLoop.Serve(listener)
if err != nil {
panic("netpoll server exit")
}
}
// 读事件处理
func handler(ctx context.Context, connection netpoll.Connection) error {
total := 2
t := time.Now()
reader := connection.Reader()
data, err := reader.Peek(reader.Len())
log.Printf("before Next, len: %v, data: %v", reader.Len(), string(data))
data, err = reader.Next(total)
if err != nil {
log.Printf("Next failed, total: %v, reader.Len: %v, block time: %v, error: %v", total, reader.Len(), int(time.Since(t)), err)
return err
}
log.Printf("after Next, len: %v, data: %v, timeused: %v", len(data), string(data), int(time.Since(t).Seconds()))
n, err := connection.Write(data)
if err != nil {
return err
}
if n != len(data) {
return fmt.Errorf("write failed: %v < %v", n, len(data))
}
return nil
}
go run ./netpoll.go
2021/07/18 07:25:22 before Next, len: 1, data: a
2021/07/18 07:25:24 after Next, len: 2, data: aa, timeused: 2
2021/07/18 07:25:25 before Next, len: 1, data: b
2021/07/18 07:25:30 Next failed, total: 2, reader.Len: 1, block time: 5005315692, error: connection read timeout 5s
2021/07/18 07:25:30 before Next, len: 1, data: b
2021/07/18 07:25:35 Next failed, total: 2, reader.Len: 1, block time: 5017124559, error: connection read timeout 5s
2021/07/18 07:25:35 before Next, len: 1, data: b
2021/07/18 07:25:40 Next failed, total: 2, reader.Len: 1, block time: 5009562038, error: connection read timeout 5s
2021/07/18 07:25:40 before Next, len: 1, data: b
2021/07/18 07:25:45 Next failed, total: 2, reader.Len: 1, block time: 5008370180, error: connection read timeout 5s
2021/07/18 07:25:45 before Next, len: 1, data: b
2021/07/18 07:25:50 Next failed, total: 2, reader.Len: 1, block time: 5011104792, error: connection read timeout 5s
2021/07/18 07:25:50 before Next, len: 1, data: b
2021/07/18 07:25:55 after Next, len: 2, data: bb, timeused: 4
2021/07/18 07:25:56 before Next, len: 1, data: c
2021/07/18 07:26:01 Next failed, total: 2, reader.Len: 1, block time: 5009599769, error: connection read timeout 5s
2021/07/18 07:26:01 before Next, len: 1, data: c
2021/07/18 07:26:06 Next failed, total: 2, reader.Len: 1, block time: 5017649436, error: connection read timeout 5s
2021/07/18 07:26:06 before Next, len: 1, data: c
2021/07/18 07:26:11 Next failed, total: 2, reader.Len: 1, block time: 5015780369, error: connection read timeout 5s
2021/07/18 07:26:11 before Next, len: 1, data: c
2021/07/18 07:26:16 Next failed, total: 2, reader.Len: 1, block time: 5013565228, error: connection read timeout 5s
2021/07/18 07:26:16 before Next, len: 1, data: c
2021/07/18 07:26:21 Next failed, total: 2, reader.Len: 1, block time: 5004234323, error: connection read timeout 5s
2021/07/18 07:26:21 before Next, len: 1, data: c
2021/07/18 07:26:26 Next failed, total: 2, reader.Len: 1, block time: 5014860948, error: connection read timeout 5s
2021/07/18 07:26:26 before Next, len: 1, data: c
2021/07/18 07:26:31 Next failed, total: 2, reader.Len: 1, block time: 5009890510, error: connection read timeout 5s
2021/07/18 07:26:31 before Next, len: 1, data: c
2021/07/18 07:26:36 Next failed, total: 2, reader.Len: 1, block time: 5009386524, error: connection read timeout 5s
2021/07/18 07:26:36 before Next, len: 1, data: c
2021/07/18 07:26:41 Next failed, total: 2, reader.Len: 1, block time: 5009694923, error: connection read timeout 5s
2021/07/18 07:26:41 before Next, len: 1, data: c
2021/07/18 07:26:46 Next failed, total: 2, reader.Len: 1, block time: 5006999390, error: connection read timeout 5s
2021/07/18 07:26:46 before Next, len: 1, data: c
2021/07/18 07:26:51 Next failed, total: 2, reader.Len: 1, block time: 5016639111, error: connection read timeout 5s
2021/07/18 07:26:51 before Next, len: 1, data: c
2021/07/18 07:26:56 Next failed, total: 2, reader.Len: 1, block time: 5004699154, error: connection read timeout 5s
2021/07/18 07:26:56 before Next, len: 1, data: c
2021/07/18 07:27:01 Next failed, total: 2, reader.Len: 1, block time: 5003720648, error: connection read timeout 5s
2021/07/18 07:27:01 before Next, len: 1, data: c
2021/07/18 07:27:06 Next failed, total: 2, reader.Len: 1, block time: 5013684114, error: connection read timeout 5s
2021/07/18 07:27:06 before Next, len: 1, data: c
2021/07/18 07:27:11 Next failed, total: 2, reader.Len: 1, block time: 5008594864, error: connection read timeout 5s
2021/07/18 07:27:11 before Next, len: 1, data: c
2021/07/18 07:27:16 Next failed, total: 2, reader.Len: 1, block time: 5016949058, error: connection read timeout 5s
2021/07/18 07:27:16 before Next, len: 1, data: c
### 一直这样提示