Go语言实现TCP通信
TCP协议
TCP/IP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。
TCP服务端- 一个TCP服务端可以同时连接很多个客户端。
- 因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次连接就创建一个goroutine去处理。
TCP服务端程序的处理流程:
- 监听端口
- 接收客户端请求建立连接
- 创建goroutine处理连接
package main
import (
"fmt"
"net"
"os"
)
//处理错误的函数
func ServerHandlerErr(err error, where string){
if err != nil{
fmt.Println(err,where)
os.Exit(1)
}
}
func ProcessMsg(conn net.Conn){
//创建消息缓冲区
buff := make([]byte, 1024)
//接收消息
for{
//读取客户端的消息,发送缓冲区
n, readerr := conn.Read(buff)
//处理可能出现的错误
ServerHandlerErr(readerr, "conn.Read")
//转换称字符串打印出来
receivedmsg := string(buff[0:n])
fmt.Println(receivedmsg, "from ",conn.RemoteAddr())
if receivedmsg == "exit"{
break
}
}
conn.Close()
fmt.Println("Connection Closed From ", conn.RemoteAddr())
}
func main(){
listen, err := net.Listen("tcp", "127.0.0.1:8888")
//处理可能出现的错误
ServerHandlerErr(err, "net.Listen")
fmt.Println("Start listening at ", listen.Addr())
//循环接入所有客户端
for{
conn, accepterr := listen.Accept()
ServerHandlerErr(accepterr, "listen.Accept")
//一个客户端用一个协程接收数据
go ProcessMsg(conn)
}
}
TCP客户端
TCP客户端程序的处理流程:
- 连接服务端
- 发送数据
- 结束连接
package main
import (
"bufio"
"fmt"
"net"
"os"
)
//处理错误的函数
func ClientHandlerErr(err error, where string){
if err != nil{
fmt.Println(err, where)
os.Exit(1)
}
}
func main(){
//与服务端建立连接
conn, err := net.Dial("tcp", "127.0.0.1:8888")
//处理可能出现的错误
ClientHandlerErr(err, "net.Dial")
fmt.Println("Please say...")
//消息缓冲区
//buff := make([]byte, 1024)
//从命令行标准输入中获取数据
reader := bufio.NewReader(os.Stdin)
//循环发送数据
for{
linemsg, _, _ := reader.ReadLine()
conn.Write(linemsg)
if string(linemsg) == "exit"{
break
}
}
conn.Close()
}