Golang中TCP编程详解:net包下的秘密

发表时间: 2018-03-11 12:25

Socket有两种:TCP Socket和UDP Socket,TCP和UDP是协议。

确定一个进程需要三元组,IP地址、协议和端口。用的较多的也就是TCP,这里主要介绍TCP相关的函数方法。

IP类型的定义在net包中

var ip net.IP = net.ParseIP("127.0.0.1")

net.TCPConn可作为客户端服务器端交互的通道,利用它的Read()和Write()可以读写数据。

net.TCPAddr表示一个TCP的地址信息

type TCPAddr struct {

IP IP

Port int

}

func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)

通过net包中的DialTCP函数来建立一个TCP连接,并返回一个TCPConn类型的对象.

func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)

net参数是"tcp4"、"tcp6"、"tcp"中的任意一个,分别表示TCP(IPv4-only)、TCP(IPv6-only)或者TCP(IPv4,IPv6的任意一个)

laddr表示本机地址,一般设置为nil,raddr表示远程的服务地址

在服务器端我们需要绑定服务到指定的非激活端口,并监听此端口,当有客户端请求到达的时候可以接收到来自客户端连接的请求。

func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)

func (l *TCPListener) Accept() (c Conn, err os.Error)

TCP有很多连接控制函数:

func DialTimeout(net, addr string, timeout time.Duration) (Conn, error)

设置建立连接的超时时间,客户端和服务器端都适用,当超过设置时间时,连接自动关闭。

用来设置写入/读取一个连接的超时时间。

func (c *TCPConn) SetReadDeadline(t time.Time) error

func (c *TCPConn) SetWriteDeadline(t time.Time) error

设置客户端是否和服务器端保持长连接,可以降低建立TCP连接时的握手开销,对于一些需要频繁交换数据的应用场景比较适用。

func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error

tcp超时检测:

if neterr, ok := err.(net.Error); ok && neterr.Timeout()

TCP连接网站示例

import (

"bytes"

"fmt"

"io"

"net"

"os"

)

func Tcptest() {

service := "www.csdn.net:80" // 后面要跟端口号

conn, err := net.Dial("tcp", service)

checkError2(err)

_, err = conn.Write([]byte("HEAR / HTTP/1.0\r\n\r\n"))

checkError2(err)

result, err := readFully2(conn)

checkError2(err)

fmt.Println(string(result))

os.Exit(0)

}

func checkError2(err error) {

if err != nil {

fmt.Fprint(os.Stderr, "Fatal error: %s", err.Error())

os.Exit(1)

}

}

func readFully2(conn net.Conn) ([]byte, error) {

defer conn.Close()

result := bytes.NewBuffer(nil)

var buf [512]byte

for {

n, err := conn.Read(buf[0:])

result.Write(buf[0:n])

if err != nil {

if err == io.EOF {

break

}

return nil, err

}

}

return result.Bytes(), nil

}

结果示例:

HTTP/1.1 404 Not Found

Server: ngx_openresty

Date: Sat, 20 Sep 2014 07:49:31 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 162

Connection: close

<html>

<head><title>404 Not Found</title></head>

<body bgcolor="white">

\<center><h1>404 Not Found</h1></center>

\<hr><center>nginx</center>

</body>

</html>