1. Socket
package utils
import (
"fmt"
"net"
"os"
"strconv"
"strings"
"time"
)
func SocketServer(port string) {
// 通过net.ResolveTCPAddr()实现一个连接对象
tcpAddr, tcpErr := net.ResolveTCPAddr("tcp4", port)
checkError(tcpErr)
// 通过监听服务不断获取客户端发来的请求
listenTCP, listenErr := net.ListenTCP("tcp", tcpAddr)
checkError(listenErr)
for {
conn, err := listenTCP.Accept()
if err != nil {
continue
}
// 通过go关键字实现服务端的多并发处理客户端请求
go handleClient(conn)
// 在实际开发还需要通过心跳来判断连接是否存在
}
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "fatal error: %s", err.Error())
os.Exit(1)
}
}
func handleClient(conn net.Conn) {
// 通过设置超时时间控制TCP连接
conn.SetReadDeadline(time.Now().Add(2 * time.Minute))
requestData := make([]byte, 128)
defer conn.Close()
for {
// TCPConn 可以用在客户端和服务器端来读写数据
data_len, err := conn.Read(requestData)
if err != nil {
fmt.Println(err)
break
}
if data_len == 0 {
break
} else if strings.TrimSpace(string(requestData[:data_len])) == "timestamp" {
daytime := strconv.FormatInt(time.Now().Unix(), 10)
conn.Write([]byte(daytime))
} else {
daytime := time.Now().String()
conn.Write([]byte(daytime))
}
requestData = make([]byte, 128)
}
}