Go基础知识-TCP/UDP
1.网络编程:物理层->数据链路层->网络层->传输层->应用层
2.Socket是应用层与TCP/IP协议族通信的中间软件抽象层
3.TCP编程:net包里面,并且粘包的问题需要注意
服务端处理流程:
1.监听端口
2.接收客户端请求建立链接
3.创建goroutine处理链接
客户端处理流程:
1.建立与服务端连接 2. 收发数据 3.关闭连接
案例:
服务端:
func main(){
//1.监听端口:Listen
listen,err := net.Listen("tcp","127.0.0.1:4567")
if err != nil{
fmt.Println("listen error:",err)
return
}
defer listen.Close()
fmt.Println("listen success")
//接收客户端请求建立连接 Accept
for{
//建立连接
conn,err := listen.Accept()
if err != nil{
fmt.Println("Accept error:",err)
continue
}
fmt.Println("收到客户端连接进来=",conn.RemoteAddr().String())
//接收数据
go func(_conn net.Conn) {
defer _conn.Close()
for{
reader := bufio.NewReader(_conn)
var buf [128]byte
n,err := reader.Read(buf[:])
if err != nil{
fmt.Println("read err:",err)
break
}
data := string(buf[:n])
fmt.Println("receive data=",data)
//给客户端发一条
_conn.Write([]byte("已经收到这条消息"))
}
}(conn)
}
}
//使用tcp工具发送
//结果如下:
listen success
收到客户端连接进来= 127.0.0.1:55559
receive data= 你哈啊
read err: read tcp 127.0.0.1:4567->127.0.0.1:55559: wsarecv: An existing connection was forcibly closed by the remote host.
客户端:
func main(){
//1.建立与服务端连接 2. 收发数据 3.关闭连接
_conn,err := net.Dial("tcp","127.0.0.1:4567")
if err != nil{
fmt.Println("conn to server error:",err)
return
}
defer _conn.Close()
//2. 收发数据 Accept
for i:=0;i<10;i++{
//发送数据
_,err = _conn.Write([]byte("你好server"))
if err != nil{
fmt.Println("send msg err=",err)
return
}
//接收服务端数据
var buf [128]byte
n,err := _conn.Read(buf[:])
if err != nil{
fmt.Println("read server content error",err)
return
}
fmt.Println("server msg=",string(buf[:n]))
}
}
4.UDP编程:换个函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!