第一次跑到互联网公司实习 。。感觉自己进步飞快啊~第一周刚写了个HTTP服务器用于微信公共号的点餐系统~ 第二周就直接开始一边自学GO语言一边写用于Socket的服务器了。。。
因为发现Golang这一块资料挺少的,接下来我会在Blog里把整个Server的Coding,还有遇到的坑都记录下来~
在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、receive等一系列操作头疼,只要使用Golang中自带的net包即可很方便的完成连接等操作~
在这里,给出一个最最基础的基于Socket的Server的写法:
package main import ( "fmt" "net" "log" "os" ) func main() { //建立socket,监听端口 netListen,err := net.Listen("tcp","localhost:1024") CheckError(err) defer netListen.Close() Log("Waiting for clients") for { conn,err := netListen.Accept() if err != nil { continue } Log(conn.RemoteAddr().String()," tcp connect success") handleConnection(conn) } } //处理连接 func handleConnection(conn net.Conn) { buffer := make([]byte,2048) for { n,err := conn.Read(buffer) if err != nil { Log(conn.RemoteAddr().String()," connection error: ",err) return } Log(conn.RemoteAddr().String(),"receive data string:\n",string(buffer[:n])) } } func Log(v ...interface{}) { log.Println(v...) } func CheckError(err error) { if err != nil { fmt.Fprintf(os.Stderr,"Fatal error: %s",err.Error()) os.Exit(1) } }
唔,抛除Go语言里面10行代码有5行error的蛋疼之处,你可以看到,Server想要建立并接受一个Socket,其核心流程就是
netListen,"localhost:1024")
conn,err := netListen.Accept()
n,err := conn.Read(buffer)
这三步,通过Listen、Accept 和Read,我们就成功的绑定了一个端口,并能够读取从该端口传来的内容~
Server写好之后,接下来就是Client方面啦,我手写一个HelloWorld给大家:
package main import ( "fmt" "net" "os" ) func sender(conn net.Conn) { words := "hello world!" conn.Write([]byte(words)) fmt.Println("send over") } func main() { server := "127.0.0.1:1024" tcpAddr,err := net.ResolveTCPAddr("tcp4",server) if err != nil { fmt.Fprintf(os.Stderr,err.Error()) os.Exit(1) } conn,err := net.DialTCP("tcp",nil,tcpAddr) if err != nil { fmt.Fprintf(os.Stderr,err.Error()) os.Exit(1) } fmt.Println("connect success") sender(conn) }
可以看到,Client这里的关键在于
tcpAddr,server)
conn,tcpAddr)
这两步,主要是负责解析端口和连接~
写好Server和Client之后,让我们运行一下看看:~~
成功运行,Console出现Server等待连接的提示:
然后我们运行Client:
成功连接Server啦,让我们看看Server那边的成果:
Server端成功的收到了我们的Hello-World啦,至于后面的那行红字,则是断开连接的提示~
到这里,一个最基础的使用Socket的Server-Client框架就出来啦~
如果想要让Server能够响应来自不同Client的请求,我们只要在Server端的代码的main入口中,
在handleConnection(conn net.Conn) 这句代码的前面加上一个 go,就可以让服务器并发处理不同的Client发来的请求啦
关于Golang的并发处理,可以参考这里Golang并行计算
下一篇,我会写一下如何在Server和Client中设计一个通讯协议,从而达到自己的一些特殊要求~
原文链接:https://www.f2er.com/go/190280.html