實(shí)戰(zhàn)?? 聊天室 ??建議手收藏??">【Golang】??實(shí)戰(zhàn)?? 聊天室 ??建議手收藏??
882
2025-04-01
【golang】??走進(jìn) Go 語(yǔ)言?? 第二十四課 TCP 高階操作
概述
基礎(chǔ)知識(shí)
Conn 接口
net.Listen()
listener.Accept()
conn.Read()
conn.Write()
交互式通信
服務(wù)器
客戶端
輸出結(jié)果:
概述
golang 是一個(gè)跨平臺(tái)的新生編程語(yǔ)言. 今天小白就帶大家一起攜手走進(jìn) Golang 的世界. (第 24 課)
基礎(chǔ)知識(shí)
Conn 接口
Conn 是一種通用的面向流的網(wǎng)絡(luò)連接. 多個(gè) Goroutine 可以同時(shí)調(diào)用 Conn 上的方法.
net.Listen()
監(jiān)聽(tīng)本地網(wǎng)絡(luò)的廣播.
格式:
net.Listen(network, address string)
1
參數(shù):
network: 網(wǎng)絡(luò)模式, “tcp”, “tcp4”, “tcp6”, “unix”, “unixpacket” 六選一
address: 網(wǎng)絡(luò)地址
例子:
listen_socket, err := net.Listen("tcp", "127.0.0.1:8888")
1
返回值:
listen_socket: 監(jiān)聽(tīng)接口
err: 錯(cuò)誤
listener.Accept()
連接客戶端.
格式:
listener.Accept()
1
例子:
conn, err := listen_socket.Accept()
1
返回值:
conn: 網(wǎng)絡(luò)接口
err: 錯(cuò)誤
conn.Read()
讀取信息.
格式:
conn.Read(b []byte)
1
例子:
nums, err := conn.Read(buffer)
1
返回值:
nums: 讀取的字節(jié)數(shù)
err: 錯(cuò)誤
conn.Write()
傳輸信息.
格式:
conn.Write(b []byte)
1
例子:
conn.Write([]byte("Hi, Server"))
1
交互式通信
服務(wù)器
package main import ( "fmt" "net" ) // 發(fā)送消息 func send_info(conn net.Conn) { // 發(fā)送消息 _, err := conn.Write([]byte("Message received")) error_check(err) fmt.Println("發(fā)送消息: Message received") } // 接收消息 func receive_info(conn net.Conn) { // 緩沖 buffer := make([]byte, 1024) // 循環(huán)讀取 for { // 讀取數(shù)據(jù) nums, err := conn.Read(buffer) if err != nil { break } if nums != 0 { // 獲取地址 address := conn.RemoteAddr() fmt.Println("收到消息:", string(buffer[:nums]), "來(lái)自:", address) } // 發(fā)送消息 send_info(conn) } } // 錯(cuò)誤處理 func error_check(err error) { if err != nil { fmt.Println("Error:", err) } } func main() { fmt.Println("服務(wù)端正在啟動(dòng)...") // 創(chuàng)建TCP服務(wù)端 listen_socket, err := net.Listen("tcp", "127.0.0.1:8888") error_check(err) // 關(guān)閉 defer listen_socket.Close() fmt.Println("服務(wù)端啟動(dòng)完畢, 等待連接...") // 啟動(dòng)連接 for { // 連接新客戶端 conn, err := listen_socket.Accept() error_check(err) // 接收每一個(gè)客戶端 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" ) // 發(fā)送消息 func send_msg(conn net.Conn) { // 循環(huán)發(fā)送 for { // 讀取鍵盤輸入 reader := bufio.NewReader(os.Stdin) // 讀取一行 data, _, _ := reader.ReadLine() // 收到exit, 關(guān)閉客戶端 if string(data) == "exit" { fmt.Println("客戶端關(guān)閉") break } // 發(fā)送輸入的字符串 _, err := conn.Write(data) if err != nil { conn.Close() fmt.Println("Error:", err, "客戶端關(guān)閉") break } } } func main() { fmt.Println("客服端正在建立連接...") // 建立網(wǎng)絡(luò)連接 conn, err := net.Dial("tcp", "127.0.0.1:8888") if err != nil { fmt.Println("網(wǎng)絡(luò)連接錯(cuò)誤") os.Exit(1) } fmt.Println("客戶端成功連接到服務(wù)器, 服務(wù)器地址:", conn.RemoteAddr()) // 發(fā)送消息 go send_msg(conn) // 接收消息 buffer := make([]byte, 1024) // 循環(huán)接收 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
輸出結(jié)果:
服務(wù)端:
服務(wù)端正在啟動(dòng)... 服務(wù)端啟動(dòng)完畢, 等待連接... 收到消息: 洞1洞1, 我是洞2 來(lái)自: 127.0.0.1:62831 發(fā)送消息: Message received 收到消息: 洞1洞1, 我是洞3 來(lái)自: 127.0.0.1:55002 發(fā)送消息: Message received
1
2
3
4
5
6
客戶端:
客服端正在建立連接... 客戶端成功連接到服務(wù)器, 服務(wù)器地址: 127.0.0.1:8888 洞1洞1, 我是洞3 收到消息: Message received
1
2
3
4
Go TCP/IP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。