16网络编程
16.1tcp
client
- 建立与服务端的链接
- 进行数据收发
- 关闭链接
func main(){
//与服务端建立连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil{
fmt.Printf("dial failed:%v\n", err)
return
}
input := bufio.NewReader(os.Stdin)
for{
s, err := input.ReadString('\n')
if err != nil{
continue
}
//去掉空格
s = strings.TrimSpace(s)
if strings.ToUpper(s) == "Q"{
return
}
//发消息
_, err2 := conn.Write([]byte(s))
if err != nil{
fmt.Printf("send failed:%v", err2)
return
}
//从服务端接受回复的消息
var buf [1024]byte
n , err3 := conn.Read(buf[:])
if err3 !=nil{
fmt.Printf("read failed, %v\n", err3)
}
fmt.Println("received msg:", string(buf[:n]))
}
}
server
- 监听端口
- 接收客户端请求建立链接
- 创建goroutine处理链接。
func process(conn net.Conn){
defer conn.Close()
//针对当前的链接做数据的发送和接受工作
for{
reader := bufio.NewReader(conn)
var buf [128]byte
n, err := reader.Read(buf[:])
if err != nil{
fmt.Printf("err occured :%v\n", err)
break
}
recv := string(buf[:n])
fmt.Println("receive data:", recv)
conn.Write([]byte("ok"))
}
}
func main(){
//开启服务
listen, err := net.Listen("tcp", "127.0.0.1:20000")
if err!=nil{
fmt.Printf("err occured:%v\n", err)
return
}
for{
//等待客户端来建立链接
conn, err := listen.Accept()
if err != nil{
fmt.Printf("err occured:%v\n", err)
}
//启动一个单独的goroutine来处理链接
go process(conn)
}
}
16.2udp
client
func main(){
udp, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil{
fmt.Println("err occured---", err)
return
}
defer udp.Close()
for{
input := bufio.NewReader(os.Stdin)
//fmt.Println("input string:",input)
s, _ := input.ReadString('\n')
_, err2 := udp.Write([]byte(s))
if err2 != nil{
fmt.Println("-err-------")
return
}
//接受数据
var buf [1024]byte
n, addr, err3 := udp.ReadFromUDP(buf[:])
if err3 != nil{
fmt.Println("error---:", err3)
}
fmt.Printf("read from%v, data :%v", addr, string(buf[:n]))
}
}
server
func main(){
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 30000,
})
if err != nil{
fmt.Printf("err occured when listen udp:%v", err)
}
defer listen.Close()
for{
var buf [1024]byte
n, addr, err := listen.ReadFromUDP(buf[:])
if err != nil{
fmt.Println("err occured when read from udp:", err)
return
}
//接受到的数据
fmt.Println("接受到的数据为:", string(buf[:n]))
//返回数据
fmt.Println(addr)
_, err2 := listen.WriteToUDP(buf[:n], addr)
if err2 != nil{
fmt.Printf("err occured:%v", err2)
continue
}
}
}