tcp socket 基础

tcp 客户端/服务端常用读写函数

func (c *TCPConn) Write(b []byte) (n int, err os.Error)
func (c *TCPConn) Read(b []byte) (n int, err os.Error)

服务端监听端口函数

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

服务端接收客户端请求函数

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

客户端向服务端发起请求函数

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表示远程的服务地址

TCPAddr类型

type TCPAddr struct { 
  IP IP
  Port int 
}
// 获取 TCPAdder 类型函数
func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)

tcp 链接控制函数

// 设置连接的超时时间,客户端和服务器端都适用,当超过设置的时间时该连接就会失效
func (c *TCPConn) SetTimeout(nsec int64) os.Error
// 设置客户端是否和服务器端一直保持着连接,即使没有任何的数据发送
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error

example:
server 端代码

package main

import (
    "fmt"
    "net"
    "os"
    // "io/ioutil"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0])
        os.Exit(1)
    }

    service := os.Args[1]
    // 指定要访问的服务端地址
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    checkError(err)

    // 向服务端发起请求
    conn, err := net.DialTCP("tcp4", nil, tcpAddr)
    checkError(err)

    // 往服务端写入数据
    _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
    checkError(err)

    // ioutil.ReadAll 会阻塞到产生err或则读取到EOF才会返回
    // result, err := ioutil.ReadAll(conn)
    // checkError(err)

    var buf = make([]byte, 1024)
    // 阻塞式读取服务端返回的数据
    n, err := conn.Read(buf)

    fmt.Println("read %d bytes, content is %s\n", n, string(buf[:n]))
    os.Exit(0)
}

func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }
}

client 端代码

package main

import (
    "fmt"
    "net"
    "os"
    // "io/ioutil"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0])
        os.Exit(1)
    }

    service := os.Args[1]
    // 指定要访问的服务端地址
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    checkError(err)

    // 向服务端发起请求
    conn, err := net.DialTCP("tcp4", nil, tcpAddr)
    checkError(err)

    // 往服务端写入数据
    _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
    checkError(err)

    // ioutil.ReadAll 会阻塞到产生err或则读取到EOF才会返回
    // result, err := ioutil.ReadAll(conn)
    // checkError(err)

    var buf = make([]byte, 1024)
    // 阻塞式读取服务端返回的数据
    n, err := conn.Read(buf)

    fmt.Println("read %d bytes, content is %s\n", n, string(buf[:n]))
    os.Exit(0)
}

func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容