网络编程入门
在tcp/ip模型的应用层和传输层中,基于传输层抽象了一系列接口,而此接口即用于我们的实际开发中为socket(套接字)。
socket也叫套接字, 是为了方便程序员进行网络开发而被设计出来的编程接口. socket在OSI七层模型中是属于传输层(TCP,UDP协议)之上 的一个抽象接口.Go语言的标准库net包里对socket封装了一些列实现网络通信的api
简单理解:一层一层加密包起来,然后再一层一层解开
服务端
package main
import (
"fmt"
"net"
)
func process(conn net.Conn) {
//关闭连接
defer conn.Close()
for {
//创建一个新切片
buf := make([]byte, 1024)
//等待客户端发送conn信息
//如果客户端没有write发送,那么携程就一直堵在这里
// fmt.Printf("服务器等待客户端%s", conn.RemoteAddr().String())
// fmt.Println("服务器正在接受数据")
n, err := conn.Read(buf)
if err != nil {
// fmt.Println("服务器的read err = ", err)
fmt.Println("客户端关闭连接")
return
}
//显示客户端发送的内容到服务器的终端
//简写 buf[:n] --》 buf[0:n]
fmt.Println("服务器正在接受数据=", string(buf[:n]))
//直接写成 string(buf) 有时候会打印回显出问题
}
}
func main() {
fmt.Println("开始监听")
listem, en := net.Listen("tcp", "0.0.0.0:8888")
if en != nil {
fmt.Println("Listen err=", en)
}
//延时关闭
defer listem.Close()
//循环等待
for {
//等待客户端来连接
fmt.Printf("listem src=%v", listem)
conn, err := listem.Accept()
if err != nil {
// fmt.Println("Accept err = ", err)
fmt.Println("连接失败")
} else {
// fmt.Printf("Accept suc con=%v", conn)
fmt.Println("客户端发送的数据为", conn)
}
//开启一个携程
go process(conn)
}
}
客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("Accept err = ", err)
return
}
fmt.Printf("成功=%v", conn)
读取用户输入
reader := bufio.NewReader(os.Stdin)
for {
line, err2 := reader.ReadString('\n')
if err2 != nil {
fmt.Println("ReadSlice err = ", err2)
}
//按exit 退出
line = strings.Trim(line, "\n")
if line == "exit" {
fmt.Println("客户端退出了")
break
}
//将n发送给服务端
n, err3 := conn.Write([]byte(line))
if err3 != nil {
fmt.Println("Write err = ", err3)
}
fmt.Println("客服端发送了", n)
}
}
效果图
blog.csdnimg.cn/632616ae6d5d4870bd9a4689b2a85fdf.png)
简单记录下日常学习做记录,比较菜,多多包涵