go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP、TCP/IP、UDP、域名解析和Unix域socket等。和大多数语言一样go可以使用几行代码便可以启动一个服务器,但是得益于goroutine的配合go实现的服务器拥有强大并发处理能力。
二、socket编程Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。
go中socket编程实现起来非常方便,下面是处理流程
服务器端:
监听端口
接受客户端连接
创建goroutine处理连接
客户端:
建立连接
收发数据
关闭连接
服务端示例:
package main import ( "fmt" "net" ) func handle(conn net.Conn) { //处理连接方法 defer conn.Close() //关闭连接 for{ buf := make([]byte,100) n,err := conn.Read(buf) //读取客户端数据 if err!=nil { fmt.Println(err) return } fmt.Printf("read data size %d msg:%s", n, string(buf[0:n])) msg := []byte("hello,world\n") conn.Write(msg) //发送数据 } } func main() { fmt.Println("start server....") listen,err := net.Listen("tcp","0.0.0.0:3000") //创建监听 if err != nil{ fmt.Println("listen failed! msg :" ,err) return } for{ conn,errs := listen.Accept() //接受客户端连接 if errs != nil{ fmt.Println("accept failed") continue } go handle(conn) //处理连接 } }