项目作者: php2go

项目描述 :
Package netpoll implements a network poller based on epoll/kqueue.
高级语言: Go
项目地址: git://github.com/php2go/netpollmux.git
创建时间: 2021-08-21T11:13:52Z
项目社区:https://github.com/php2go/netpollmux

开源协议:Apache License 2.0

下载


netpollmux

PkgGoDev
Go Report Card
LICENSE

Package netpollmux implements a network poller based on epoll/kqueue.

Features

  • Epoll/kqueue
  • TCP/UNIX
  • Compatible with the net.Conn interface.
  • Upgrade connection
  • Non-blocking I/O
  • Splice/sendfile
  • Rescheduling workers

Comparison to other packages.

Package net netpollmux gnet evio
Low memory usage No Yes Yes Yes
Non-blocking I/O No Yes Yes Yes
Splice/sendfile Yes Yes No No
Rescheduling Yes Yes No No
Compatible with the net.Conn interface Yes Yes No No

Benchmark

mock 0msmock 1ms

Get started

Install

  1. go get github.com/php2go/netpollmux

Import

  1. import "github.com/php2go/netpollmux"

Usage

Simple Example

  1. package main
  2. import "github.com/php2go/netpollmux"
  3. func main() {
  4. var handler = &netpoll.DataHandler{
  5. NoShared: true,
  6. NoCopy: true,
  7. BufferSize: 1024,
  8. HandlerFunc: func(req []byte) (res []byte) {
  9. res = req
  10. return
  11. },
  12. }
  13. if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
  14. panic(err)
  15. }
  16. }

TLS Example

  1. package main
  2. import (
  3. "crypto/tls"
  4. "github.com/php2go/netpollmux/internal/socket"
  5. "github.com/php2go/netpollmux/netpoll"
  6. "net"
  7. )
  8. func main() {
  9. var handler = &netpoll.DataHandler{
  10. NoShared: true,
  11. NoCopy: true,
  12. BufferSize: 1024,
  13. HandlerFunc: func(req []byte) (res []byte) {
  14. res = req
  15. return
  16. },
  17. }
  18. handler.SetUpgrade(func(conn net.Conn) (net.Conn, error) {
  19. tlsConn := tls.Server(conn, socket.DefalutTLSConfig())
  20. if err := tlsConn.Handshake(); err != nil {
  21. return nil, err
  22. }
  23. return tlsConn, nil
  24. })
  25. if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
  26. panic(err)
  27. }
  28. }

Websocket Example

  1. package main
  2. import (
  3. "github.com/php2go/netpollmux/internal/websocket"
  4. "github.com/php2go/netpollmux/netpoll"
  5. "net"
  6. )
  7. func main() {
  8. var handler = &netpoll.ConnHandler{}
  9. handler.SetUpgrade(func(conn net.Conn) (netpoll.Context, error) {
  10. return websocket.Upgrade(conn, nil)
  11. })
  12. handler.SetServe(func(context netpoll.Context) error {
  13. ws := context.(*websocket.Conn)
  14. msg, err := ws.ReadMessage()
  15. if err != nil {
  16. return err
  17. }
  18. return ws.WriteMessage(msg)
  19. })
  20. if err := netpoll.ListenAndServe("tcp", ":9999", handler); err != nil {
  21. panic(err)
  22. }
  23. }

HTTP Example

  1. package main
  2. import (
  3. "bufio"
  4. "log"
  5. "net"
  6. "net/http"
  7. "sync"
  8. "github.com/php2go/netpollmux/internal/logger"
  9. "github.com/php2go/netpollmux/mux"
  10. "github.com/php2go/netpollmux/netpoll"
  11. )
  12. func main() {
  13. m := mux.NewRoute()
  14. m.GET("/hello/:id", func(w http.ResponseWriter, req *http.Request, params httprouter.Params) {
  15. pp := req.URL.Query()
  16. logger.Info("query params:", params, pp)
  17. mux.JSON(w, req, []string{"hello world"}, http.StatusOK)
  18. })
  19. log.Fatal(m.Run(":8080"))
  20. }