golang--类似mochiweb的多进程监听tcp链接
2016-02-22 00:00
561 查看
用Erlang开发web,很可能就会使用到mochiweb。mochiweb使用16个Erlang式的进程来监听tcp链接,使得任何链接进来都会很快得到处理。Golang跟Erlang很像,在这里实现了一个类似mochiweb的tcp监控链接,一个简单的echo服务器。先看代码。
上面代码保存为multi_thread_echo.go, 使用gotool编译
上面代码使用了100个goroutine来监听TCP链接,每个链接进来,都会新建2个goroutine,一个read,一个write。下面看看效果图:
参考:
2.Network programming with Go
http://jan.newmarch.name/go/
转贴请注明来自:格通
1 package main 2 3 import ( 4 "log" 5 "runtime" 6 "net" 7 ) 8 9 func main() { 10 11 tcpAddr, err := net.ResolveTCPAddr("tcp", ":9988") 12 check_error(err) 13 tcpListener, err := net.ListenTCP("tcp", tcpAddr) 14 check_error(err) 15 for i := 0; i < 100; i++ { 16 go handle_tcp_accept(tcpListener) 17 } 18 19 select {} 20 } 21 22 23 24 func handle_tcp_accept(tcpListener *net.TCPListener) { 25 for { 26 tcpConn, err := tcpListener.AcceptTCP() 27 if err != nil { 28 log.Println("tcp accept failed!") 29 continue 30 } else { 31 connChan := make(chan []byte) 32 go write_tcp_conn(tcpConn, connChan) 33 go read_tcp_conn(tcpConn, connChan) 34 } 35 } 36 37 } 38 39 40 func read_tcp_conn(tcpConn *net.TCPConn, connChan chan []byte) { 41 buffer := make([]byte, 2048) 42 tcpConn.SetReadBuffer(2048) 43 for { 44 n, err := tcpConn.Read(buffer[0:]) 45 if err != nil { 46 log.Println("one tcp connection read function failed!") 47 log.Println("one tcp connection close now!") 48 tcpConn.Close() 49 runtime.Goexit() 50 } else { 51 connChan <- buffer[0 : n-1] 52 } 53 } 54 } 55 56 func write_tcp_conn(tcpConn *net.TCPConn, connChan chan []byte) { 57 for { 58 msg := <-connChan 59 log.Println(string(msg)) 60 tcpConn.Write([]byte(msg)[0 : len(msg)+1]) 61 } 62 } 63 64 65 66 67 func check_error(err error) { 68 if err != nil { 69 log.Printf("Fatal error : %s", err.Error()) 70 } 71 72 }
上面代码保存为multi_thread_echo.go, 使用gotool编译
go build multi_thread_echo.go
上面代码使用了100个goroutine来监听TCP链接,每个链接进来,都会新建2个goroutine,一个read,一个write。下面看看效果图:
参考:
1.Golang Away: TCP Chat Server
http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/2.Network programming with Go
http://jan.newmarch.name/go/
转贴请注明来自:格通
相关文章推荐
- virtualbox--在win7设置ubuntu虚拟机网络
- erlang访问https地址
- iOS网络编程之一——iOS网络框架简介
- iOS网络编程之二——NSURLSession的简单使用
- iOS网络编程之三——NSURLConnection的简单使用
- Centos6.5查看nginx并发连接数和TCP连接状态命令
- 计算机网络9--计算机网络性能
- HTTP协议上传boundary确定&下载content-disposition理解
- TCP/IP、Http、Socket的区别
- java35.HTTP通信------使用HttpClient进行Post方式通信
- 前端开发必备!Emmet使用手册(转自 http://www.w3cplus.com/tools/emmet-cheat-sheet.html)
- keepalived(nginx)+httpd实现动静分离
- Sublime text 3 中Package Control 的安装与使用方法(转自 http://devework.com/sublime-text-3-package-control.html)
- java34.HTTP通信------使用HttpClient进行Get方式通信
- 开源一个网络图片浏览器HooPhotoBrowser
- okhttp
- Unity使用protobuf-net实现的网络框架
- iscsi 挂载网络存储及存储访问
- Sublime Text 3 破解版 + 注册机 + 汉化包(转自 http://www.cnsecer.com/251.html)
- sublime text 3(Build 3103)最新注册码(转自 http://blog.csdn.net/the_victory/article/details/50681152)