【Golang】✔️走进 Go 语言✔️ 第二十四课 TCP 高阶操作

网友投稿 728 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

【Golang】✔️走进 Go 语言✔️ 第二十四课 TCP 高阶操作

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小时内删除侵权内容。

上一篇:数据库种类这么多,它们都有什么区别呢?【这次高斯不是数学家】
下一篇:windows 里面常用的cmd命令
相关文章