8000 GitHub - changyl/nbio: Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
/ nbio Public
forked from lesismal/nbio

Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.

License

Notifications You must be signed in to change notification settings

changyl/nbio

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NBIO - NON-BLOCKING IO

Slack

Mentioned in Awesome Go MIT licensed Go Version Build Status Go Report Card Coverage Statusd

Contents

Features

Cross Platform

< BEA2 ul class="contains-task-list">
  • Linux: Epoll with LT/ET/ET+ONESHOT supported, LT as default
  • BSD(MacOS): Kqueue
  • Windows: Based on std net, for debugging only
  • Protocols Supported

    • TCP/UDP/Unix Socket supported
    • TLS supported
    • HTTP/HTTPS 1.x supported
    • Websocket supported, Passes the Autobahn Test Suite, OnOpen/OnMessage/OnClose order guaranteed

    Interfaces

    • Implements a non-blocking net.Conn(except windows)
    • SetDeadline/SetReadDeadline/SetWriteDeadline supported
    • Concurrent Write/Close supported(both nbio.Conn and nbio/nbhttp/websocket.Conn)

    Quick Start

    package main
    
    import (
    	"log"
    
    	"github.com/lesismal/nbio"
    )
    
    func main() {
    	engine := nbio.NewEngine(nbio.Config{
    		Network:            "tcp",//"udp", "unix"
    		Addrs:              []string{":8888"},
    		MaxWriteBufferSize: 6 * 1024 * 1024,
    	})
    
    	// hanlde new connection
    	engine.OnOpen(func(c *nbio.Conn) {
    		log.Println("OnOpen:", c.RemoteAddr().String())
    	})
    	// hanlde connection closed
    	engine.OnClose(func(c *nbio.Conn, err error) {
    		log.Println("OnClose:", c.RemoteAddr().String(), err)
    	})
    	// handle data
    	engine.OnData(func(c *nbio.Conn, data []byte) {
    		c.Write(append([]byte{}, data...))
    	})
    
    	err := engine.Start()
    	if err != nil {
    		log.Fatalf("nbio.Start failed: %v\n", err)
    		return
    	}
    	defer engine.Stop()
    
    	<-make(chan int)
    }

    TCP Echo Examples

    UDP Echo Examples

    TLS Examples

    HTTP Examples

    HTTPS Examples

    Websocket Examples

    Websocket TLS Examples

    Use With Other STD Based Frameworkds

    Magics For HTTP and Websocket

    Different IOMod

    IOMod Remarks
    IOModNonBlocking There's no difference between this IOMod and the old version with no IOMod. All the connections will be handled by poller.
    IOModBlocking All the connections will be handled by at least one goroutine, for websocket, we can set Upgrader.BlockingModAsyncWrite=true to handle writting with a separated goroutine and then avoid Head-of-line blocking on broadcasting scenarios.
    IOModMixed We set the Engine.MaxBlockingOnline, if the online num is smaller than it, the new connection will be handled by single goroutine as IOModBlocking, else the new connection will be handled by poller.

    The IOModBlocking aims to improve the performance for low online service, it runs faster than std. The IOModMixed aims to keep a balance between performance and cpu/mem cost in different scenarios: when there are not too many online connections, it performs better than std, or else it can serve lots of online connections and keep healthy.

    Using Websocket With Std Server

    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    
    	"github.com/lesismal/nbio/nbhttp/websocket"
    )
    
    func echo(w http.ResponseWriter, r *http.Request) {
    	u := websocket.NewUpgrader()
    	u.OnMessage(func(c *websocket.Conn, mt websocket.MessageType, data []byte) {
    		c.WriteMessage(mt, data)
    	})
    	_, err := u.Upgrade(w, r, nil)
    	if err != nil {
    		log.Print("upgrade:", err)
    		return
    	}
    }
    
    func main() {
    	mux := &http.ServeMux{}
    	mux.HandleFunc("/ws", echo)
    	server := http.Server{
    		Addr:    "localhost:8080",
    		Handler: mux,
    	}
    	fmt.Println("server exit:", server.ListenAndServe())
    }

    More Examples

    Credits

    About

    Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.

    Resources

    License

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

    No packages published

    Languages

    • Go 99.5%
    • Other 0.5%
    0