golang中的socket编程
关于socket的基础知识,这里就不介绍了,可以参考python socket编程。
golang创建socket很简单,服务端处理流程通常为:
- 监听端口
- 接受客户端的连接请求
- 创建goroutine,处理该请求
示例代码如下:
package main
import (
"fmt"
"net"
)
func main() {
//服务器监听地址
fmt.Println("start server...")
listen, err := net.Listen("tcp", "127.0.0.1:50000")
if err != nil {
fmt.Println("listen failed,err:", err)
return
}
//接受客户端信息
for {
conn, err := listen.Accept()
if err != nil {
fmt.Println("accept failed,err:", err)
continue
}
//用协程建立连接
go process(conn)
}
}
//读取数据
func process(conn net.Conn) {
defer conn.Close()
for {
buf := make([]byte, 512)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("read err:", err)
return
}
fmt.Printf(string(buf[0:n]))
}
}
客户端处理流程通常为:
- 建立与服务端的连接
- 与服务端进行数据交互
- 关闭连接
示例代码如下:
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "localhost:50000")
if err != nil {
fmt.Println("Error dialing", err.Error())
return
}
defer conn.Close()
inputReader := bufio.NewReader(os.Stdin)
for {
input, _ := inputReader.ReadString('\n')
trimmedInput := strings.Trim(input, "\r\n")
if trimmedInput == "Q" {
return
}
_, err = conn.Write([]byte(trimmedInput))
if err != nil {
return
}
}
}
使用TCP socket发送HTTP请求
package main
import (
"fmt"
"io"
"net"
)
func main() {
conn, err := net.Dial("tcp", "www.baidu.com:80")
if err != nil {
fmt.Println("Error dialing", err.Error())
return