-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(server): 完成reactor server开发,但测试过程中遇到个问题
Signed-off-by: Trino <[email protected]>
- Loading branch information
Showing
8 changed files
with
776 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package server | ||
|
||
import ( | ||
"context" | ||
"github.com/cloudwego/netpoll" | ||
"net" | ||
) | ||
|
||
// NetpollEventLoopServer 字节的NIO eventLoop 网络库 | ||
type NetpollEventLoopServer struct { | ||
listener net.Listener | ||
eventLoop netpoll.EventLoop | ||
} | ||
|
||
func NewNetpollEventLoopServer(addr string, handler netpoll.OnRequest) (*NetpollEventLoopServer, error) { | ||
var srv = &NetpollEventLoopServer{} | ||
var err error | ||
|
||
srv.listener, err = netpoll.CreateListener("tcp", addr) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
srv.eventLoop, err = netpoll.NewEventLoop(handler) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return srv, nil | ||
} | ||
|
||
func (els *NetpollEventLoopServer) Serve() error { | ||
return els.eventLoop.Serve(els.listener) | ||
} | ||
|
||
func (els *NetpollEventLoopServer) Close() error { | ||
return els.eventLoop.Shutdown(context.Background()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package server | ||
|
||
// ProactorServer 自实现的proactor网络模式服务器 | ||
// 或许后续可以实现个windows版本 | ||
type ProactorServer struct { | ||
} | ||
|
||
func NewProactorServer() *ProactorServer { | ||
return &ProactorServer{} | ||
} | ||
|
||
func (ps *ProactorServer) Serve() { | ||
|
||
} | ||
|
||
func (ps *ProactorServer) Close() error { | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
package server | ||
|
||
import ( | ||
"context" | ||
"log" | ||
"net" | ||
"sync" | ||
) | ||
|
||
// PureGoroutineServer 没用多路IO复用,纯goroutine并发 | ||
type PureGoroutineServer struct { | ||
mutex sync.Mutex | ||
serverTransport net.Listener | ||
handler simpleHandler | ||
stop chan struct{} | ||
done sync.WaitGroup | ||
} | ||
|
||
func NewPureGoroutineServer(addr string, handler simpleHandler) (*PureGoroutineServer, error) { | ||
var srv = &PureGoroutineServer{ | ||
handler: handler, | ||
stop: make(chan struct{}), | ||
} | ||
var err error | ||
srv.serverTransport, err = net.Listen("tcp", addr) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return srv, nil | ||
} | ||
|
||
func (pgc *PureGoroutineServer) Serve() error { | ||
for { | ||
select { | ||
case <-pgc.stop: | ||
return nil | ||
default: | ||
} | ||
|
||
conn, err := pgc.serverTransport.Accept() | ||
if err != nil { | ||
pgc.mutex.Lock() | ||
select { | ||
case <-pgc.stop: | ||
pgc.mutex.Unlock() | ||
return nil | ||
default: | ||
log.Println(err) | ||
close(pgc.stop) | ||
pgc.mutex.Unlock() | ||
return err | ||
} | ||
} | ||
|
||
pgc.done.Add(2) | ||
ctx, cancel := context.WithCancel(context.Background()) | ||
// bizHandler | ||
go func() { | ||
defer func() { | ||
if err := conn.Close(); err != nil { | ||
log.Println(err) | ||
} | ||
pgc.done.Done() | ||
cancel() | ||
}() | ||
pgc.handler(ctx, conn) | ||
}() | ||
// notifier | ||
go func() { | ||
defer pgc.done.Done() | ||
select { | ||
case <-pgc.stop: | ||
cancel() | ||
case <-ctx.Done(): | ||
} | ||
}() | ||
} | ||
} | ||
|
||
func (pgc *PureGoroutineServer) Close() error { | ||
pgc.mutex.Lock() | ||
defer pgc.mutex.Unlock() | ||
err := pgc.serverTransport.Close() | ||
if err != nil { | ||
return err | ||
} | ||
close(pgc.stop) | ||
pgc.done.Wait() | ||
return nil | ||
} |
Oops, something went wrong.