在网络编程,无论哪种编程语言,本身对于学习这门语言的用户,都有着很强的吸引力,那今天来看看 Go 的网络编程是个什么样的。
这里先给出一个 ping-pong 的 tcp server & tcp client 的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package main
import ( "fmt" "net" )
func handle(conn net.Conn) { for {
} }
func main() { server, err := net.Listen("tcp", ":8000") if err != nil { panic(err) }
for { client, err := server.Accept() if err != nil { panic(err) }
var data = make([]byte, 1024) count, err := client.Read(data)
if err != nil { panic(err) }
if count > 0 { fmt.Printf("%s\n", string(data[:count])) } else { fmt.Println("nothing") }
client.Write([]byte("pong")) } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main
import ( "fmt" "net" )
func main() { client, err := net.Dial("tcp", ":8000") if err != nil { panic(err) }
client.Write([]byte("ping")) var data = make([]byte, 1024) count, err := client.Read(data) if err != nil { panic(err) }
if count > 0 { fmt.Printf("%s\n", string(data[:count])) } else { fmt.Println("nothing") } client.Close() }
|
以上两段实现了 client 向 server 发送 ping,server 向 client 响应 pong。
- 调用
net.Listen
创建了服务端的 socket
, net.Listen
接收两个参数,一个表示协议类型,另一个表示监听的地址和端口;
- 用一个死循环,让 server 去不断的从 accept 队列中,获取已经创建好的
tcp
连接;
- 如果有来自客户端连接,就调用
Read
方法读取来自客户端的数据,这里 Read
接收的参数类型为 []byte
,特别注意,需要给 byte 数组设置长度,不然读不出来数据;
- 打印读出来的数据后,再调用
Write
方法,发送 pong 给客户端。
- 调用
net.Dial
创建客户端套接字,参数和 net.Listen
一样;
- 剩下的步骤和 server 端一致。
可以说在 golang 中实现 tcp server & client,比 c 语言简单了不少。
参考链接