这里是关于实现golang TCP服务器端和客户端,并计算RTT时间操作的完整攻略。下面我们一步步来实现。
初始设置
首先,为了实现TCP服务器端和客户端,可以使用Go语言标准库中的net
包,这个包提供了各种用于网络通信的功能,我们需要引入这个包,如下:
import (
"net"
)
接下来,我们需要定义一些常量、变量等,在本例中我们需要定义服务器和客户端的IP地址和端口号,并且定义一个用于接收客户端消息的缓冲区:
const (
ip = "127.0.0.1"
port = "8888"
)
var receiveBuf = make([]byte, 1024)
其中,ip是我们的服务器和客户端都在本地运行,所以使用127.0.0.1进行本地回环,port则是服务器和客户端通信使用的端口号。
实现TCP服务器端
接下来我们来实现TCP服务器端,下面的代码展示了如何创建一个TCP服务器,侦听指定的IP地址和端口号,并监听客户端发来的连接请求:
ln, err := net.Listen("tcp", ip+":"+port)
if err != nil {
panic(err)
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
go handleClient(conn)
}
在代码中,我们先调用Listen函数创建侦听对象ln,用于监听指定IP地址和端口号,如果有客户端连接,会调用Accept函数进行处理。其中,handleClient函数是用于处理客户端连接的具体逻辑,我们稍后会讲到此函数的实现方法。
接下来,我们来编写handleClient函数,用于具体实现客户端连接的处理逻辑:
func handleClient(conn net.Conn) {
defer conn.Close()
// 接收数据
n, err := conn.Read(receiveBuf)
if err != nil {
log.Println(err)
return
}
// 获取客户端发送的消息并显示
message := string(receiveBuf[:n])
log.Println(message)
// 计算返回消息的RTT时间
rt := time.Now().Sub(start)
log.Printf("RTT: %v", rt)
// 向客户端发送消息
_, err = conn.Write([]byte("Message received"))
if err != nil {
log.Println(err)
return
}
}
以上代码实现的逻辑如下:首先,我们定义一个defer语句,确保在函数执行完毕后立即关闭连接。然后,我们通过连接对象的Read方法来读取客户端发送的消息,并将其存储在缓冲区中。接下来,根据需要,我们可以在log中显示来自客户端的消息。
除此之外,在这个函数内我们还计算了返回消息的RTT时间,并使用计算出来的时间值在log中显示。最后,我们使用连接对象的Write方法将一个简单的确认消息发送回客户端,以告知客户端消息已接收。
到这里,我们的TCP服务器实现就完成了。
实现TCP客户端
接下来我们来实现TCP客户端。下面的代码展示了如何创建一个TCP连接,并向服务器发送消息:
conn, err := net.Dial("tcp", ip+":"+port)
if err != nil {
panic(err)
}
defer conn.Close()
// 向服务器发送消息
_, err = conn.Write([]byte("Hello World"))
if err != nil {
log.Println(err)
return
}
// 接收服务器返回的消息
n, err := conn.Read(receiveBuf)
if err != nil {
log.Println(err)
return
}
message := string(receiveBuf[:n])
log.Println(message)
在代码中,我们首先通过Dial函数创建一个TCP连接对象conn,并向指定的IP地址和端口号发起连接请求。如果连接成功,我们就可以使用Write方法发送消息,使用Read方法接收消息。最后,我们显示接收到的消息。
到这里,我们的TCP客户端实现就完成了。
示例
下面,我们来演示一下实际的运行功能:
TCP服务器
package main
import (
"log"
"net"
"time"
)
const (
ip = "127.0.0.1"
port = "8888"
)
var receiveBuf = make([]byte, 1024)
func main() {
// 启动服务器
ln, err := net.Listen("tcp", ip+":"+port)
if err != nil {
panic(err)
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
go handleClient(conn)
}
}
func handleClient(conn net.Conn) {
defer conn.Close()
// 接收数据
n, err := conn.Read(receiveBuf)
if err != nil {
log.Println(err)
return
}
// 获取客户端发送的消息并显示
message := string(receiveBuf[:n])
log.Println(message)
// 计算返回消息的RTT时间
rt := time.Now().Sub(start)
log.Printf("RTT: %v", rt)
// 向客户端发送消息
_, err = conn.Write([]byte("Message received"))
if err != nil {
log.Println(err)
return
}
}
TCP客户端
package main
import (
"log"
"net"
)
const (
ip = "127.0.0.1"
port = "8888"
)
var receiveBuf = make([]byte, 1024)
func main() {
// 连接服务器
conn, err := net.Dial("tcp", ip+":"+port)
if err != nil {
panic(err)
}
defer conn.Close()
// 向服务器发送消息
_, err = conn.Write([]byte("Hello World"))
if err != nil {
log.Println(err)
return
}
// 接收服务器返回的消息
n, err := conn.Read(receiveBuf)
if err != nil {
log.Println(err)
return
}
message := string(receiveBuf[:n])
log.Println(message)
}
以上代码在运行时,当客户端发送消息时,服务器会显示该消息,并计算处理时间,并返回一个简单的确认消息。客户端则显示接收到的确认消息。在此基础上,可以根据需要进行扩展和修改,以实现更复杂的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang 实现tcp server端和client端,并计算RTT时间操作 - Python技术站