我来详细讲解一下“Go语言服务器开发之简易TCP客户端与服务端实现方法”的完整攻略。
简介
本攻略将会介绍如何使用Go语言实现简单的TCP客户端与TCP服务端,并且在两者之间成功地建立连接。TCP(Transmission Control Protocol)是一种基于连接的协议,是因特网基础设施的一部分,用于传输数据。
实现方法
TCP服务端
首先,我们需要编写TCP服务端的代码。服务端需要首先监听客户端的连接请求,并且在连接成功后,接受客户端发送的数据,并对其进行处理。下面是一个简单的TCP服务端实现代码:
package main
import (
"fmt"
"net"
)
func main() {
// 监听端口
l, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
// 等待连接请求
for {
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
return
}
// 新建一个协程处理连接
go func(conn net.Conn) {
// 处理连接
handleConnection(conn)
}(conn)
}
}
// 处理连接函数
func handleConnection(conn net.Conn) {
// 关闭连接
defer conn.Close()
// 读取客户端数据
buf := make([]byte, 1024)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
// 输出客户端发送的数据
fmt.Printf("Received data: %s\n", string(buf))
}
在程序中,我们使用 net.Listen
方法监听8080端口的请求,并且在该端口接收到客户端请求后,通过 l.Accept
方法接受客户端连接。接着,我们将接受到的连接交由一个新的协程处理,该协程调用 handleConnection
函数并处理接收到的数据。在 handleConnection
函数中,我们使用 conn.Read
方法读取客户端发送的数据,并且简单地将其输出到终端上。
TCP客户端
在TCP客户端中,我们需要向服务端发送连接请求,并且在连接成功后,向服务端发送数据。下面是一个简单的TCP客户端实现代码:
package main
import (
"fmt"
"net"
)
func main() {
// 连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
// 发送数据
_, err = conn.Write([]byte("Hello world!"))
if err != nil {
fmt.Println("Error sending:", err.Error())
return
}
// 收到回复
buf := make([]byte, 1024)
_, err = conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
fmt.Printf("Received data: %s\n", string(buf))
// 关闭连接
conn.Close()
}
在程序中,我们使用 net.Dial
方法连接服务端,在成功建立连接后,通过 conn.Write
方法向服务端发送数据,并且使用 conn.Read
方法读取服务端发送回来的数据。
示例说明
示例1:本地通讯
我们在本地创建一个TCP服务端,并通过TCP客户端与之建立连接,成功地发送和接收数据,如下所示:
服务端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 监听端口
l, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
fmt.Println("TCP server start...")
// 等待连接请求
for {
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
return
}
go func(conn net.Conn) {
// 处理连接
handleConnection(conn)
}(conn)
}
}
// 处理连接函数
func handleConnection(conn net.Conn) {
// 关闭连接
defer conn.Close()
// 读取客户端数据
buf := make([]byte, 1024)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
// 输出客户端发送的数据
fmt.Printf("Received data: %s\n", string(buf))
// 发送响应
_, err = conn.Write([]byte("Hello client!"))
if err != nil {
fmt.Println("Error writing:", err.Error())
return
}
}
客户端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 连接服务器
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
// 发送数据
_, err = conn.Write([]byte("Hello server!"))
if err != nil {
fmt.Println("Error sending:", err.Error())
return
}
// 收到回复
buf := make([]byte, 1024)
_, err = conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
fmt.Printf("Received data: %s\n", string(buf))
// 关闭连接
conn.Close()
}
我们在本地分别运行服务端和客户端代码,可以看到服务端成功地接收到了客户端发送的数据,同时客户端也成功地收到了服务端发送回来的数据。
示例2:跨主机通讯
我们将TCP服务端程序部署在云服务器上,并且通过TCP客户端向该服务器发送数据,测试其网络通信情况,如下所示:
服务端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 监听端口
l, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
fmt.Println("TCP server start...")
// 等待连接请求
for {
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
return
}
go func(conn net.Conn) {
// 处理连接
handleConnection(conn)
}(conn)
}
}
// 处理连接函数
func handleConnection(conn net.Conn) {
// 关闭连接
defer conn.Close()
// 读取客户端数据
buf := make([]byte, 1024)
_, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
// 输出客户端发送的数据
fmt.Printf("Received data: %s\n", string(buf))
// 发送响应
_, err = conn.Write([]byte("Hello client!"))
if err != nil {
fmt.Println("Error writing:", err.Error())
return
}
}
客户端代码:
package main
import (
"fmt"
"net"
)
func main() {
// 连接服务器
conn, err := net.Dial("tcp", "123.12.34.56:8080") // 修改为自己云服务器IP地址
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
// 发送数据
_, err = conn.Write([]byte("Hello server!"))
if err != nil {
fmt.Println("Error sending:", err.Error())
return
}
// 收到回复
buf := make([]byte, 1024)
_, err = conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
fmt.Printf("Received data: %s\n", string(buf))
// 关闭连接
conn.Close()
}
我们将服务端程序部署在云服务器上,并通过TCP客户端向该服务器发送数据,可以看到客户端成功连接上服务端,并且服务端成功地接收到了客户端发送的数据,同时客户端也成功地收到了服务端发送回来的数据。这说明网络通信正常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言服务器开发之简易TCP客户端与服务端实现方法 - Python技术站