脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - go语言中的udp协议及TCP通讯实现示例

go语言中的udp协议及TCP通讯实现示例

2022-09-15 14:16Jeff的技术栈 Golang

这篇文章主要为大家介绍了go语言中的udp协议及TCP通讯的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

udp协议

server端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main
import (
    "fmt"
    "net"
)
func main() {
    // 创建监听
    socket, err := net.ListenUDP("udp4", &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("监听失败!", err)
        return
    }
    defer socket.Close()
    for {
        // 读取客户端传来的数据
        data := make([]byte, 4096)
        read, remoteAddr, err := socket.ReadFromUDP(data)
        if err != nil {
            fmt.Println("读取数据失败!", err)
            continue
        }
        fmt.Println(read, remoteAddr)
        fmt.Printf("%s\n\n", data)
        //发送数据,告诉客户端已收到
        senddata := []byte("hello client!")
        _, err = socket.WriteToUDP(senddata, remoteAddr)
        if err != nil {
            return
            fmt.Println("发送数据失败!", err)
        }
    }
}

client端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main
import (
    "fmt"
    "net"
)
func main() {
    // 创建连接
    socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("连接失败!", err)
        return
    }
    defer socket.Close()
    // 发送给服务端数据
    senddata := []byte("hello server!")
    _, err = socket.Write(senddata)
    if err != nil {
        fmt.Println("发送数据失败!", err)
        return
    }
    // 接收客户端的数据
    data := make([]byte, 4096)
    read, remoteAddr, err := socket.ReadFromUDP(data)
    if err != nil {
        fmt.Println("读取数据失败!", err)
        return
    }
    fmt.Println(read, remoteAddr)
    fmt.Printf("%s\n", data)
}

TCP通讯(基本)

服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main
import (
    "fmt"
    "net"
)
func main() {
    //监听
    listener, err := net.Listen("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    defer listener.Close()
    //阻塞等待用户链接
    conn, err := listener.Accept()
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    //接收用户的请求
    buf := make([]byte, 1024) //1024大小的缓冲区
    n, err1 := conn.Read(buf)
    if err1 != nil {
        fmt.Println("err1 = ", err1)
        return
    }
    fmt.Println("buf = ", string(buf[:n]))
    defer conn.Close() //关闭当前用户链接
}

客户端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main
import (
    "fmt"
    "net"
)
func main() {
    //主动连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    defer conn.Close()
    //发送数据
    conn.Write([]byte("are u ok?"))
}

TCP通讯并发服务器

服务端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main
import (
    "fmt"
    "net"
    "strings"
)
//处理用户请求
func HandleConn(conn net.Conn) {
    //函数调用完毕,自动关闭conn
    defer conn.Close()
    //获取客户端的网络地址信息
    addr := conn.RemoteAddr().String()
    fmt.Println(addr, " conncet sucessful")
    buf := make([]byte, 2048)
    for {
        //读取用户数据
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println("err = ", err)
            return
        }
        fmt.Printf("[%s]: %s\n", addr, string(buf[:n]))
        fmt.Println("len = ", len(string(buf[:n])))
        //if "exit" == string(buf[:n-1]) { //nc测试
        if "exit" == string(buf[:n-2]) { //自己写的客户端测试, 发送时,多了2个字符, "\r\n"
            fmt.Println(addr, " exit")
            return
        }
        //把数据转换为大写,再给用户发送
        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
 
}
func main() {
    //监听
    listener, err := net.Listen("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    defer listener.Close()
    //接收多个用户
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("err = ", err)
            return
        }
        //处理用户请求, 新建一个协程
        go HandleConn(conn)
    }
}

客户端

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main
import (
    "fmt"
    "net"
    "os"
)
func main() {
    //主动连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("net.Dial err = ", err)
        return
    }
    //main调用完毕,关闭连接
    defer conn.Close()
    go func() {
        //从键盘输入内容,给服务器发送内容
        str := make([]byte, 1024)
        for {
            n, err := os.Stdin.Read(str) //从键盘读取内容, 放在str
            if err != nil {
                fmt.Println("os.Stdin. err = ", err)
                return
            }
            //把输入的内容给服务器发送
            conn.Write(str[:n])
        }
    }()
    //接收服务器回复的数据
    //切片缓冲
    buf := make([]byte, 1024)
    for {
        n, err := conn.Read(buf) //接收服务器的请求
        if err != nil {
            fmt.Println("conn.Read err = ", err)
            return
        }
        fmt.Println(string(buf[:n])) //打印接收到的内容, 转换为字符串再打印
    }
}

以上就是go语言中的udp协议及TCP通讯实现示例的详细内容,更多关于go语言udp协议TCP通讯的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/guyouyin123/p/13994712.html

延伸 · 阅读

精彩推荐
  • Golanggoland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac)

    这篇文章主要介绍了goland2020.2.x永久激活码破解详细教程亲测可用(Windows Linux Mac) ,对goland激活码注册码相关知识感兴趣的朋友跟随小编一起看看吧...

    中关村老大爷37892021-02-05
  • Golang在 Golang 中运行 JavaScript

    在 Golang 中运行 JavaScript

    我们知道,在 Python 里面,如果你要运行一段 JavaScript,你可以使用execJS这种第三方库。那么在 Golang 里面,你想运行 JavaScript 的时候又应该怎么办呢?...

    未闻Code7432022-01-22
  • GolangGo通道channel通过通信共享内存

    Go通道channel通过通信共享内存

    这篇文章主要为大家介绍了Go通道channel通过通信共享内存示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    LiberHome10732022-07-05
  • Golanggolang分层测试之http接口测试入门教程

    golang分层测试之http接口测试入门教程

    这篇文章主要介绍了golang分层测试之http接口测试入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    周学习的名字被占了5012020-05-21
  • GolangGo语言流程控制详情

    Go语言流程控制详情

    这篇文章主要介绍了Go语言流程控制详情,流程控制包含分三大类:条件判断,循环控制和无条件跳转。下面关于更多相关内容需要的小伙伴可以参考一下...

    苏州程序大白8642022-09-13
  • Golanggo实现冒泡排序算法

    go实现冒泡排序算法

    冒泡排序算法是数据结构中常用的一种算法,本文就介绍了go实现冒泡排序算法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    嵌入式职场8312022-09-06
  • GolangGo语言中的Base64编码原理介绍以及使用

    Go语言中的Base64编码原理介绍以及使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息,下面这篇文章主要给大家介绍了关于Go语言中的Base64编...

    漫漫Coding路3602022-09-01
  • Golanggolang有用的库及工具 之 zap.Logger包的使用指南

    golang有用的库及工具 之 zap.Logger包的使用指南

    这篇文章主要介绍了golang有用的库及工具 之 zap.Logger包的使用指南,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    逆月林8742021-03-01