Giter Site home page Giter Site logo

gotcp's People

Contributors

bryant1410 avatar gansidui avatar jazzthinking avatar sunmiao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gotcp's Issues

请问gotcp 框架的处理性能你有测试过吗?

请问gotcp 框架的处理性能你有测试过吗?
安装下列两种情况,使用gotcp作为server端的处理性能大概是多少呢?
1.client---->gotcp_server 这种情况下的gotcp_server 的处理量是多少每秒?
2.client---->interface---->gotcp_server 这种情况下的gotcp_server 的处理量是多少每秒?

请教一个问题

你好,
首先感谢您写的这个框架,有个疑问,在conn.go的101行,是不是有可能会导致崩溃?所以有一个recover?
谢谢

ReadPacket只能一次返回一个包呀.

如果是telnetprotol中的例子。考虑一个粘包问题:
客户端连续发送:
echo 123 [\r\n]
echo 456 [\r\n]

这个时候ReadPacket只能处理echo 123,echo 456就被丢弃了..

waitGroup.Add(1) 不能放置于 goroutine 内部

wg := sync.WaitGroup{}
go func() {
  wg.Add(1)
  defer wg.Done()
}()
wg.Wait()

这样的代码会出现预想 goroutine 还没来得及被调度,主 goroutine 就已经执行到 wg.Wait() 直接 Game Over

正确的处理应该是:

wg := sync.WaitGroup{}
wg.Add(1)
go func() {
  defer wg.Done()
}()
wg.Wait()

wg.Add(1)wg.Wait() 需要在同一个 goroutine 中。使用 go run -race 也会提示 DATA RACE

具体如下:

$ go run -race examples/echo/server/server.go
listening: [::]:8989
^CSignal:  interrupt
==================
WARNING: DATA RACE
Write by main goroutine:
  sync.raceWrite()
      /usr/local/Cellar/go/1.5.1/libexec/src/sync/race.go:41 +0x2e
  sync.(*WaitGroup).Wait()
      /usr/local/Cellar/go/1.5.1/libexec/src/sync/waitgroup.go:124 +0xf9
  github.com/gansidui/gotcp.(*Server).Stop()
      /Users/larry/src/github.com/gansidui/gotcp/server.go:63 +0x6a
  main.main()
      /Users/larry/src/github.com/gansidui/gotcp/examples/echo/server/server.go:63 +0x9cf

Previous read by goroutine 7:
  sync.raceRead()
      /usr/local/Cellar/go/1.5.1/libexec/src/sync/race.go:37 +0x2e
  sync.(*WaitGroup).Add()
      /usr/local/Cellar/go/1.5.1/libexec/src/sync/waitgroup.go:66 +0xfa
  github.com/gansidui/gotcp.(*Server).Start()
      /Users/larry/src/github.com/gansidui/gotcp/server.go:35 +0x52

Goroutine 7 (running) created at:
  main.main()
      /Users/larry/src/github.com/gansidui/gotcp/examples/echo/server/server.go:54 +0x415
==================
Found 1 data race(s)
exit status 66

建议以树形结构维护客户端,新增连接池,多协议,增加事件回调等

server-->db_pool_conn
-->client_conns
-->add_port1<--->protocol(增加监听端口)
-->add_port2<--->protocol(tcp、udp、其他协议)

event--->conect
event--->close
event--->task(耗时任务)
event--->recieve
我觉得可以按照计划,一步步实现这些功能,这样就是一个强大的tcp框架了
以后再引入model、rpc等

异步服务有些问题.

通过三个goroutine异步去服务一个连接, 是一个比较好的考虑.
但是通过select去一个chan里拿数据:https://github.com/gansidui/gotcp/blob/master/conn.go#L141
会存在一定的问题.
如果服务器还在write数据, 此时readloop继续去chan里select数据, 结果为eof, 这样会导致defer关闭conn,从而阻断服务器写数据的操作, 引起客户端异常.

请问如何优雅地使用gotcp框架做客户端?

我想用该框架开发一个后台系统,收到包之后顺序转发给后面的server1, 然后等待后端server1回包再请求server2,server2回包再给前端回包。
我的做法是在OnMessage里面创建goroutine使用tcp短连接发包后端server, 然后等待后端server回包。也就是SendAndRecv的过程,但是这样每个请求都要创建连接开销有点大。
另外想到的一种做法是参考异步网络框架,将连接后端server的socket也放到主线程中readloop,但是这样的话又需要维护一个状态机,不如协程做法复杂性低。请问楼主是怎么做的?

ReadPacket后,未调用 OnMessage

仿照echo server写了接收程序,在ReadPacket可正常接收数据,而数据时常无法传递到OnMessage。
已经设置PacketReceiveChanLimit=200000
不知道其他朋友是否遇到此问题,打算尝试gtcp

有个疑问

closechan里的消息, 是在什么地方放进去的?
而且 read, handle, 和write三个loop都会去接收里面的消息, 然后执行关闭操作.
那其余两个没收到, 会因为close(chan)而关闭其余的goroutine吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.