TCP链接的一些基础操作
如下为一个客户端链接服务端,并在服务端打印链接地址的例子
服务端
func main() {
addr, err := net.ResolveTCPAddr("tcp", ":8080")//建立一个tcp链接
if err!=nil{
//异常处理
return
}
tcp, err := net.ListenTCP("tcp", addr)//对链接进行监听
if err!=nil {
//异常处理
return
}
for {
conn, err := tcp.AcceptTCP()//不断接受客户端的链接
if err != nil {
//异常处理
return
}
go handleConnection(conn)
}
}
func handleConnection(conn *net.TCPConn) {
fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
}
客户端
func main() {
addr, err := net.ResolveTCPAddr("tcp", ":8080")//建立tcp链接
if err!=nil{
//异常处理
return
}
net.DialTCP("tcp", nil, addr)//链接到服务端
}
效果如下
接下来向服务端固定发生一串字符:请求出战
服务端
在处理链接函数上进行改进
func handleConnection(conn *net.TCPConn) {
buff:= make([]byte, 1024)
read, _ := conn.Read(buff)
fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
fmt.Println(conn.RemoteAddr().String() + "" + string(buff[:read]))
}
客户端
func main() {
addr, err := net.ResolveTCPAddr("tcp", ":8080")
if err!=nil{
return
}
tcp, _ := net.DialTCP("tcp", nil, addr)
tcp.Write([]byte("请求出战"))
}
效果如下
在客户端进行输入发送给服务端
服务端
不做改变
客户端
func main() {
addr, err := net.ResolveTCPAddr("tcp", ":8080")
if err!=nil{
return
}
tcp, _ := net.DialTCP("tcp", nil, addr)
reader := bufio.NewReader(os.Stdin)
line, _, _ := reader.ReadLine()
tcp.Write(line)
}
效果如下
接下来将他们改进,是他们可以长时间相互接受发送信息
服务端
同样的只需在链接处理函数中进行改进即可
func handleConnection(conn *net.TCPConn) {
for {//实现长时间接收以及返回信息
buff:= make([]byte, 1024)
read, err := conn.Read(buff)
if err!=nil {
fmt.Println(conn.RemoteAddr().String() + "断开了链接")
return
}
fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
fmt.Println(conn.RemoteAddr().String() + "对你说:" + string(buff[:read]))
s:= "服务端收到了你发送的消息:" + string(buff[:read])
conn.Write([]byte(s))//给客户端返回信息
}
}
客户端
func main() {
addr, err := net.ResolveTCPAddr("tcp", ":8080")
if err!=nil{
return
}
tcp, _ := net.DialTCP("tcp", nil, addr)
reader := bufio.NewReader(os.Stdin)
for {//实现长时间接收以及发送信息
line, _, _ := reader.ReadLine()
tcp.Write(line)
buff := make([]byte, 1024)
read, _ := tcp.Read(buff)
fmt.Println(string(buff[:read]))//打印服务端返回的信息
}
}
效果如下
服务端效果
客户端效果
本文正在参加技术专题18期-聊聊Go语言框架