文痞

人不是向外奔走才是旅行,静静坐着思维也是旅行,凡是探索、追寻、触及那些不可知的情境,不论是风土的,心灵的,还是科技的,都是一种旅行

一个go语言实现网络连接处理的简单例程

一个go语言实现网络连接处理的简单例程

服务器从网络接收客户端请求,做一些处理,再把结果返回给客户。

对于不同的用户连接,用不同的goroutine处理。定义名为UserConn的结构体来表示一个用户连接。同时,这个结构体定义了一个叫做ReadRequest的方法,用于从网络读取用户的请求;还有一个叫做WriteResponse的方法,用于从网络给用户传递结果。 func ServiceClient(conn *userConn){ ch:=make(chan *Response) go WriteRes(conn,ch) for { req:=conn.ReadRequest() switch req.Type{ case NORMAL_REQUEST: go process(req,ch) case EXIT: return } } }

func WriteRes(conn *userConn,ch *Reaponse){ for r:=range ch{ conn.WriteReaponse(r) } }

func process(req *Request, ch chan *Reaponse){ res:=calcuate(req) ch<-res }

服务端为每个用户连接开启一个goroutine,执行ServeClient函数。

go程序的编译

对于一个自包含(不依赖任何第三方库)的程序,只需要在当前目录下运行go build就会编译好整个程序。

如果我的程序依赖第三方库,又该如何呢?很简单,在代码中的import语句里,写入第三方库的在网络中的位置即可。这里的import和Java/Python中的import的概念一样,都是引入一个包。

import ( “fmt” “github.com/monnand/goredis” ) import中引入的第一个包,是fmt,这是标准库中的包,提供Printf一类的格式化输入和输出。第二个引入的包则是位于github上的代码库。它会引入github上,用户monnand下,goredis这个项目定义的包。

接下来,再调用go命令安装这个库:

go get github.com/monnand/goredis 这样,go程序就会自动下载,编译和安装这个库(包括它的依赖)。接下来再使用go build编译依赖goredis的程序。

除此以外,如果依赖goredis的程序也在github(或其他go支持的版本控制库)中,那么只用一条go get命令指明该程序所在的远程地址就足够了,go会自己下载安装各种依赖。除了github,go还支持google code,BitBucket,Launchpad,或者是任何位于其他服务器上,使用svn,git,Bazzar,Mercurial做版本控制的Go程序/库。这一切都极大地简化了开发人员和最终用户的操作。

分享到: 返回主页