基于TCP的协议是网络通信中最重要的协议。 提醒一下,HTTP,FTP,SMTP和其他协议也是它的一部分。 本文可让你深入了解如何连接到TCP服务器。
go基础库之连接到远程服务器
Golang 版本
1.14.2
前言
基于TCP的协议是网络通信中最重要的协议。 提醒一下,HTTP,FTP,SMTP和其他协议也是它的一部分。 本文可让你深入了解如何连接到TCP服务器。
实现
package main
import (
"bufio"
"context"
"fmt"
"io"
"net"
"net/http"
"time"
)
type StringServer string
func (s StringServer) ServeHTTP(rw http.ResponseWriter,
req *http.Request) {
rw.Write([]byte(string(s)))
}
func createServer(addr string) http.Server {
return http.Server{
Addr: addr,
Handler: StringServer("HELLO GOPHER!\n"),
}
}
const addr = "localhost:9090"
func main() {
s := createServer(addr)
go s.ListenAndServe()
// 与普通TCP建立连接
conn, err := net.Dial("tcp", addr)
if err != nil {
panic(err)
}
defer conn.Close()
_, err = io.WriteString(conn, "GET / HTTP/1.1\r\nHost:localhost:7070\r\n\r\n")
if err != nil {
panic(err)
}
scanner := bufio.NewScanner(conn)
conn.SetReadDeadline(time.Now().Add(time.Second))
for scanner.Scan() {
fmt.Println(scanner.Text())
}
ctx, _ := context.WithTimeout(context.Background(),
5*time.Second)
s.Shutdown(ctx)
}
$ go run main.go
HTTP/1.1 200 OK
Date: Sat, 09 May 2020 21:22:56 GMT
Content-Length: 14
Content-Type: text/plain; charset=utf-8
HELLO GOPHER!
原理
Net
包包含 Dial
函数,该函数需要传入网络类型和地址。 在前面的示例中,网络是 tcp
,地址是 localhost:9090
。
成功执行 Dial
函数后,返回 Conn
类型,它作为打开套接字的引用。 Conn
接口还定义了 Read
和 Write
函数,因此可以将它们用作 Writer
和 Reader
函数,用于从套接字进行写入和读取。 最后,示例代码使用 Scanner
获取响应。 注意Scanner
在当前代码中生效是因为有换行。 否则,应该使用更通用的 Read
方法。 在这个例子中,读取截止日期是通过 SetReadDeadline
方法设置的。 重要的是,最后期限不是一个持续时间,而是一个 Time
。 这意味着最后期限被设定为未来的一个时间点。 如果你正通过从循环中读取套接字中的数据,并且需要将读取超时设置为10秒,那么每次迭代都应该包含如下代码 conn.SetReadDeadline(time.Now().Add(10*time.Second))
。