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>