go基础库之连接到远程服务器

基于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 接口还定义了 ReadWrite 函数,因此可以将它们用作 WriterReader 函数,用于从套接字进行写入和读取。 最后,示例代码使用 Scanner 获取响应。 注意Scanner 在当前代码中生效是因为有换行。 否则,应该使用更通用的 Read 方法。 在这个例子中,读取截止日期是通过 SetReadDeadline 方法设置的。 重要的是,最后期限不是一个持续时间,而是一个 Time。 这意味着最后期限被设定为未来的一个时间点。 如果你正通过从循环中读取套接字中的数据,并且需要将读取超时设置为10秒,那么每次迭代都应该包含如下代码 conn.SetReadDeadline(time.Now().Add(10*time.Second))