golang socket 服务端与客户端

本文介绍了如何使用Golang编写Socket服务端和客户端。服务端代码演示了监听和连接处理,客户端则展示了如何建立连接并发送数据。通过这两部分代码,读者可以理解Golang在Socket编程中的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端代码如下:

                           

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]))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值