Go的socket服务

一. server

package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func main() {
    // 设置TCP地址
    service := "127.0.0.1:51000"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    checkError(err)
    // 设置监听
    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)
    // 接受信息
    for {
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        // go handleClient(conn)
        handleClient(conn)
    }
}

func handleClient(conn net.Conn) {
    // 设置过期时间,过了时间断开连接
    conn.SetReadDeadline(time.Now().Add(2 * time.Minute))
    go getMess(conn)
    go sendMess(conn)
}

func sendMess(conn net.Conn) {
    for {
        var s1 string
        fmt.Scan(&s1)
        fmt.Printf("我说:")
        fmt.Println(s1)
        conn.Write([]byte(s1))
    }
}

func getMess(conn net.Conn) {
    data := make([]byte, 128)
    for {
        read_len, err := conn.Read(data)
        checkError(err)
        if read_len == 0 {
            continue
        }
        fmt.Printf("对面说:")
        fmt.Println(string(data))
        data = make([]byte, 128)
    }
}

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"
)

func main() {
    // 设置TCP地址
    tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:51000")
    checkError(err)
    // 连接远程服务器
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    checkError(err)
    _, err = conn.Write([]byte("hi"))
    checkError(err)

    go sendMess(conn)
    getMess(conn)
}

func getMess(conn net.Conn) {
    data := make([]byte, 128)
    for {
        _, err := conn.Read(data)
        checkError(err)
        fmt.Printf("对面:")
        fmt.Println(string(data))
        data = make([]byte, 128)
    }
}

func sendMess(conn net.Conn) {
    for {
        var s1 string
        fmt.Scan(&s1)
        conn.Write([]byte(s1))
        fmt.Printf("我说:")
        fmt.Println(s1)
    }
}
func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(-1)
    }
}