golang--相似mochiweb的多進程監聽tcp連接

用Erlang開發web,極可能就會使用到mochiweb。mochiweb使用16個Erlang式的進程來監聽tcp連接,使得任何連接進來都會很快獲得處理。Golang跟Erlang很像,在這裏實現了一個相似mochiweb的tcp監控連接,一個簡單的echo服務器。先看代碼。golang

 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編譯web

go build multi_thread_echo.go

上面代碼使用了100個goroutine來監聽TCP連接,每一個連接進來,都會新建2個goroutine,一個read,一個write。下面看看效果圖:服務器

參考:tcp

1.Golang Away: TCP Chat Server

http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/ui

2.Network programming with Gospa

http://jan.newmarch.name/go/code

轉貼請註明來自:格通server

相關文章
相關標籤/搜索