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