golang tcp
简介
回到家里太冷了,北方的暖气真好,最近正好学完了golang的基础部分的东西,用net包实现以下tcp通信,正好也算是加深一下对计网的记忆
环境
pc,wsl,vscode,golang
思路以及代码
tcp是面向连接的协议嘛,所以肯定要有连接,因此我就写一个server端和一个client端进行通信
server端先确定要做哪些事情
- 监听端口
- 等待连接
- 接收和发送信息clint端负责请求连接和发送数据,输入Q的时候退出连接
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
45package main
import (
"bufio"
"fmt"
"net"
"os"
)
func process(conn net.Conn) {
defer conn.Close()
for {
reader := bufio.NewReader(conn) //读取conn中的对象
var buf = [512]byte{}
n, err := reader.Read(buf[:]) //使用reader中read方法读取数据
if err != nil {
fmt.Printf("read from conn failed,err:%v\n", err)
break
}
rec := string(buf[:n])
fmt.Printf("%v", rec)
input := bufio.NewReader(os.Stdin)
s, _ := input.ReadString('\n')
conn.Write([]byte(s))
}
}
func main() {
//监听端口
listen, err := net.Listen("tcp", "127.0.0.1:4444")
if err != nil {
fmt.Printf("listen failed ,err::%v\n", err)
}
//等待连接
for {
conn, err := listen.Accept() //没有收到连接请求就一直堵塞
if err != nil {
fmt.Printf("connect failed ,err:%v\n", err)
continue
}
//接收数据返回接受无误
//用一个gorutine去处理连接
go process(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
44package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
//请求连接
//发送数据
func main() {
//请求连接
conn, err := net.Dial("tcp", "127.0.0.1:4444")
if err != nil {
fmt.Println("dial failed,err:", err)
return
}
defer conn.Close()
//发送数据
for {
input := bufio.NewReader(os.Stdin) //从终端读入数据
s, _ := input.ReadString('\n')
if strings.ToUpper(s) == "Q" {
return
}
//开始发送
_, err = conn.Write([]byte(s))
if err != nil {
fmt.Println("write failed,err:", err)
}
//接收server端返回的信息
buf := [512]byte{}
n, err := conn.Read(buf[:])
if err != nil {
fmt.Println("read failed,err:", err)
return
}
fmt.Println(string(buf[:n]))
}
}通信截图
使用nc和server进行通信
使用nc和client进行通信
使用server和client进行通信