TCP/UDP简单实现(golang)
TCP服务器(并发版)
package main
import (
"fmt"
"net"
"strings"
)
func HanderConnect(c net.Conn) {
defer c.Close()
fmt.Printf("c.RemoteAddr(): %v\n", c.RemoteAddr())
fmt.Println("客户端成功连接")
//循环读取客户端发送的数据
buf := make([]byte, 4096)
for {
n, err := c.Read(buf)
if n == 0 {
fmt.Println("客户端关闭,断开连接!!")
return
}
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("读到数据:", string(buf[:n]))
//小写转大写,回写
s := strings.ToUpper(string(buf[:n]))
c.Write([]byte(s))
}
}
func main() {
l, err := net.Listen("tcp", "172.16.10.59:8001")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
defer l.Close()
//监听请求
for {
fmt.Println("服务器等待连接")
c, err := l.Accept()
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
go HanderConnect(c)
}
}
TCP客户端(并发版)
package main
import (
"fmt"
"net"
"os"
)
func main() {
c, err := net.Dial("tcp", "172.16.10.59:8001")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
defer c.Close()
//获取用户键盘输入
go func() {
str := make([]byte, 4096)
for {
n, err := os.Stdin.Read(str)
if err != nil {
fmt.Printf("err: %v\n", err)
continue
}
//写入服务器
c.Write(str[:n])
}
}()
//回显服务器回发的大写数据
buf := make([]byte, 4096)
for {
n, err := c.Read(buf)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("客户端读到数据:", string(buf[0:n]))
}
}
UDP服务端
package main
import (
"fmt"
"net"
"time"
)
func main() {
u, err := net.ResolveUDPAddr("udp", "172.16.10.59:8003")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("服务器地址结构创建成功!!")
udpConn, err := net.ListenUDP("udp", u)
defer udpConn.Close()
fmt.Println("udp服务创建成功!!!")
buf := make([]byte, 4096)
n, cltAddr, err := udpConn.ReadFromUDP(buf)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("服务器读到:", string(buf[0:n]))
fmt.Printf("cltAddr: %v\n", cltAddr)
daytime := time.Now().String()
_, err = udpConn.WriteToUDP([]byte(daytime), cltAddr)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
}
UDP客户端
package main
import (
"fmt"
"net"
"os"
)
func main() {
c, err := net.Dial("udp", "172.16.10.59:8003")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
defer c.Close()
//获取用户键盘输入
go func() {
str := make([]byte, 4096)
for {
n, err := os.Stdin.Read(str)
if err != nil {
fmt.Printf("err: %v\n", err)
continue
}
//写入服务器
c.Write(str[:n])
}
}()
//回显服务器回发的大写数据
buf := make([]byte, 4096)
for {
n, err := c.Read(buf)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println("客户端读到数据:", string(buf[0:n]))
}
}