Go小白一枚,有错误,还请各位大佬指出
TCP协议-三次握手,四次挥手
那么Go语言如何实现了,我直接上代码,一切都在代码中
talk is cheap ,show me code...
TCP服务端
package main
import (
"fmt"
"net"
"net/http"
"bufio"
_ "net/http/pprof" //可以用于查看协程信息
)
// HandleConnetion 处理请求
func HandleConnetion(conn net.Conn){
defer conn.Close()
fmt.Println("处理请求")
for {
reader := bufio.NewReader(conn)
var buf [2048]byte
//从bufio中读,阻塞
fmt.Println("------------读开始------------")
n, err := reader.Read(buf[:])
if err != nil || n == 0 {
// err == EOF 表示客户端主动断开了连接 也就是n = 0
fmt.Printf("read error %v",err)
return
}
fmt.Println("-----------读结束-------------")
fmt.Printf("客户端 ip = %v\n", conn.RemoteAddr().String())
recv := string(buf[:n])
fmt.Printf("收到的数据:%v\n", recv)
if recv == "exit" {
fmt.Printf("客户端 ip 请求关闭 = %v\n", conn.RemoteAddr().String())
return
}
_, err = conn.Write([]byte(recv))
if err != nil{
fmt.Printf("Write error %v",err)
return
}
}
}
// main 主函数
func main() {
ln, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println("tcp 创建失败")
}
go func() {
fmt.Println(http.ListenAndServe("127.0.0.1:6060", nil))
}()
for {
conn, err := ln.Accept()
if err != nil{
fmt.Println("连接错误")
}
go HandleConnetion(conn)
}
}
TCP客户端
package main
import (
"fmt"
"net"
"os"
"bufio"
"strings"
_ "time"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8888")
if err != nil {
fmt.Println("连接失败")
return
}
defer conn.Close()
input := bufio.NewReader(os.Stdin)
for {
s, _ := input.ReadString('\n')
s = strings.TrimSpace(s)
if strings.ToUpper(s) =="Q"{
return
}
_, err := conn.Write([]byte(s))
if err != nil {
fmt.Println(err)
return
}
var buf [1024]byte
// 用户设置TCP超时,如果服务端一直不反悔,可以自己主动断开
/* err = conn.SetReadDeadline(time.Now().Add(3*time.Second)) // timeout
if err != nil {
fmt.Println("setReadDeadline failed:", err)
return
} */
//从tcp链接中读,阻塞
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("收到关闭数据:%v",err)
return
}
recv := string(buf[:n])
if recv == "bbb" {
fmt.Printf("服务端请求关闭:%v",recv)
return
}
fmt.Printf("收到服务端的data:%v", recv)
}
}
至此,Go语言实现TCP的简单通讯完成了,你们学回了嘛?有疑问下方一起学习,进步