天天看點

golang socket 服務端與用戶端

服務端代碼如下:

package main

import (
    "fmt"
    "net"
    "log"
    "os"
    "bytes"
)

func main() {

    //建立socket,監聽端口
    netListen, err := net.Listen("tcp", "127.0.0.1:9999")
    CheckError(err)
    defer func(l net.Listener) {
        fmt.Println("關閉")
        l.Close()
    }(netListen)
    Log("Waiting for clients")
    for {

        conn, err := netListen.Accept()
        if err != nil {
            continue
        }
        Log(conn.RemoteAddr().String(), " 連接配接成功請求位址")
        go handleConnection(conn)
    }

}
//處理連接配接
func handleConnection(conn net.Conn) {
    buffer := make([]byte, 2048)
    Log("走了處理請求")
    for {
        Log("走的次數")
        n, err := conn.Read(buffer)
        if err != nil {
            Log(conn.RemoteAddr().String(), "連接配接錯誤的請求位址: ", err)
            return
        }
        Log(conn.RemoteAddr().String(), "這是啥資料:\n", string(buffer[:n]))
        if len(string(buffer[:n])) > 25 {
            sender(conn)
        }
    }
}
func sender(conn net.Conn) {
    Log("需要發送的xml")
    var buffer bytes.Buffer
    //var sl []string
    buffer.WriteString("<?xml version=\"1.0\" encoding=\"GBK\"?>")
    buffer.WriteString("<message>")
    buffer.WriteString("<head>")
    buffer.WriteString("<field name=\"ReceiveTime\">112823</field>")
    buffer.WriteString("<field name=\"ReceiveDate\">20151101</field>")
    buffer.WriteString("</head>")
    buffer.WriteString("<body>")
    buffer.WriteString("<field name=\"Host\">20151101</field>")
    buffer.WriteString("</body>")
    buffer.WriteString("</message>")      
Log(buffer.Bytes())
    Log("位址為===" + conn.RemoteAddr().String())
    //conn.Write([]byte(strings.Join(sl, "")))      
//-->使用數組的形式 得到byte也行 隻不過看着沒buffer這樣的好
    // ar := []byte {1, 1,1, 1}
    //for i:= 0;i< len(buffer.Bytes()); i++ {
    //    ar = append(ar,buffer.Bytes()[i])
    //}
    //Log(ar)
    Log(buffer.String())
    conn.Write(buffer.Bytes())
    Log("send over")
}
func Log(v ...interface{}) {
    log.Println(v...)
}

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

用戶端代碼如下:

package main

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

func sender(conn net.Conn) {
    words := "hello world!hello world!"
    conn.Write([]byte(words))
    fmt.Println("send over")
}

func main() {
    server := "127.0.0.1:9999"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }

    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }

    fmt.Println("connect success")
    sender(conn)
    buffer := make([]byte, 2048)
    n, err := conn.Read(buffer)
    fmt.Println(string(buffer[:n]))
}