用 Golang 实现基于 Redis 的安全高效 RPC 通信(用一生去爱你)
744
2022-05-29
【golang】✔️走进 Go 语言✔️ 第二十四课 TCP 高阶操作
概述
基础知识
Conn 接口
net.Listen()
listener.Accept()
conn.Read()
conn.Write()
交互式通信
服务器
客户端
输出结果:
概述
Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 24 课)
基础知识
Conn 接口
Conn 是一种通用的面向流的网络连接. 多个 Goroutine 可以同时调用 Conn 上的方法.
net.Listen()
监听本地网络的广播.
格式:
net.Listen(network, address string)
1
参数:
network: 网络模式, “tcp”, “tcp4”, “tcp6”, “unix”, “unixpacket” 六选一
address: 网络地址
例子:
listen_socket, err := net.Listen("tcp", "127.0.0.1:8888")
1
返回值:
listen_socket: 监听接口
err: 错误
listener.Accept()
连接客户端.
格式:
listener.Accept()
1
例子:
conn, err := listen_socket.Accept()
1
返回值:
conn: 网络接口
err: 错误
conn.Read()
读取信息.
格式:
conn.Read(b []byte)
1
例子:
nums, err := conn.Read(buffer)
1
返回值:
nums: 读取的字节数
err: 错误
conn.Write()
传输信息.
格式:
conn.Write(b []byte)
1
例子:
conn.Write([]byte("Hi, Server"))
1
交互式通信
服务器
package main import ( "fmt" "net" ) // 发送消息 func send_info(conn net.Conn) { // 发送消息 _, err := conn.Write([]byte("Message received")) error_check(err) fmt.Println("发送消息: Message received") } // 接收消息 func receive_info(conn net.Conn) { // 缓冲 buffer := make([]byte, 1024) // 循环读取 for { // 读取数据 nums, err := conn.Read(buffer) if err != nil { break } if nums != 0 { // 获取地址 address := conn.RemoteAddr() fmt.Println("收到消息:", string(buffer[:nums]), "来自:", address) } // 发送消息 send_info(conn) } } // 错误处理 func error_check(err error) { if err != nil { fmt.Println("Error:", err) } } func main() { fmt.Println("服务端正在启动...") // 创建TCP服务端 listen_socket, err := net.Listen("tcp", "127.0.0.1:8888") error_check(err) // 关闭 defer listen_socket.Close() fmt.Println("服务端启动完毕, 等待连接...") // 启动连接 for { // 连接新客户端 conn, err := listen_socket.Accept() error_check(err) // 接收每一个客户端 go receive_info(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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
客户端
package main import ( "bufio" "fmt" "net" "os" ) // 发送消息 func send_msg(conn net.Conn) { // 循环发送 for { // 读取键盘输入 reader := bufio.NewReader(os.Stdin) // 读取一行 data, _, _ := reader.ReadLine() // 收到exit, 关闭客户端 if string(data) == "exit" { fmt.Println("客户端关闭") break } // 发送输入的字符串 _, err := conn.Write(data) if err != nil { conn.Close() fmt.Println("Error:", err, "客户端关闭") break } } } func main() { fmt.Println("客服端正在建立连接...") // 建立网络连接 conn, err := net.Dial("tcp", "127.0.0.1:8888") if err != nil { fmt.Println("网络连接错误") os.Exit(1) } fmt.Println("客户端成功连接到服务器, 服务器地址:", conn.RemoteAddr()) // 发送消息 go send_msg(conn) // 接收消息 buffer := make([]byte, 1024) // 循环接收 for { // 读取消息 nums, err := conn.Read(buffer) if err != nil { fmt.Println("Error:", err) } fmt.Println("收到消息:", string(buffer[:nums])) } }
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
输出结果:
服务端:
服务端正在启动... 服务端启动完毕, 等待连接... 收到消息: 洞1洞1, 我是洞2 来自: 127.0.0.1:62831 发送消息: Message received 收到消息: 洞1洞1, 我是洞3 来自: 127.0.0.1:55002 发送消息: Message received
1
2
3
4
5
6
客户端:
客服端正在建立连接... 客户端成功连接到服务器, 服务器地址: 127.0.0.1:8888 洞1洞1, 我是洞3 收到消息: Message received
1
2
3
4
Go TCP/IP
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。