打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用Golang实现 echo服务器/客户端

用Golang实现 echo服务器/客户端

本节我们就从实现一个简单的echo的服务端/客户端来入手, 了解golang的实现tcp长连接服务器的具体细节.

首先, 我们先列一下服务端的实现思路及步骤:

  1. 创建一个套接字对象, 指定其IP以及端口.
  2. 开始监听套接字指定的端口.
  3. 如有新的客户端连接请求, 则建立一个goroutine, 在goroutine中, 读取客户端消息, 并转发回去, 直到客户端断开连接
  4. 主进程继续监听端口.

我们可以在实验环境的主文件夹中, 建立一个名为server.go的文件, 在其中编写服务器端程序代码
服务端程序清单如下:

server.go

package mainimport (    "bufio"    "fmt"    "net"    "time")func main() {    var tcpAddr *net.TCPAddr    tcpAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:9999")    tcpListener, _ := net.ListenTCP("tcp", tcpAddr)    defer tcpListener.Close()    for {        tcpConn, err := tcpListener.AcceptTCP()        if err != nil {            continue        }        fmt.Println("A client connected : " + tcpConn.RemoteAddr().String())        go tcpPipe(tcpConn)    }}func tcpPipe(conn *net.TCPConn) {    ipStr := conn.RemoteAddr().String()    defer func() {        fmt.Println("disconnected :" + ipStr)        conn.Close()    }()    reader := bufio.NewReader(conn)    for {        message, err := reader.ReadString('\n')        if err != nil {            return        }        fmt.Println(string(message))        msg := time.Now().String() + "\n"        b := []byte(msg)        conn.Write(b)    }}

接着, 我们打开终端, 编译服务端程序:

go build server.go

编译成功的话, 会在主目录中看到编译成功的server程序

接下来, 是客户端的代码实现步骤:

  1. 创建一个套接字对象, ip与端口指定到上面我们实现的服务器的ip与端口上.
  2. 使用创建好的套接字对象连接服务器.
  3. 连接成功后, 开启一个goroutine, 在这个goroutine内, 定时的向服务器发送消息, 并接受服务器的返回消息, 直到错误发生或断开连接.

程序清单如下:

client.go

package mainimport (    "bufio"    "fmt"    "net"    "time")var quitSemaphore chan boolfunc main() {    var tcpAddr *net.TCPAddr    tcpAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:9999")    conn, _ := net.DialTCP("tcp", nil, tcpAddr)    defer conn.Close()    fmt.Println("connected!")    go onMessageRecived(conn)    b := []byte("time\n")    conn.Write(b)    <-quitSemaphore}func onMessageRecived(conn *net.TCPConn) {    reader := bufio.NewReader(conn)    for {        msg, err := reader.ReadString('\n')        fmt.Println(msg)        if err != nil {            quitSemaphore <- true            break        }        time.Sleep(time.Second)        b := []byte(msg)        conn.Write(b)    }}

编译客户端:

go build client.go

最后, 开启两个终端, 分别运行server和client

可以看到以下类似的输出:

connected!2015-03-19 23:42:08.4875559 +0800 CST

2015-03-19 23:42:09.4896132 +0800 CST

2015-03-19 23:42:10.4906704 +0800 CST

2015-03-19 23:42:11.4917277 +0800 CST

2015-03-19 23:42:12.4927849 +0800 CST

2015-03-19 23:42:13.4938422 +0800 CST

2015-03-19 23:42:14.4948995 +0800 CST

2015-03-19 23:42:15.4959567 +0800 CST

2015-03-19 23:42:16.497014 +0800 CST

2015-03-19 23:42:17.4980712 +0800 CST

2015-03-19 23:42:18.4991285 +0800 CST

2015-03-19 23:42:19.5001857 +0800 CST

这样, 一个简单的echo服务器/客户端就实现了

动手实践是学习 IT 技术最有效的方式! 开始实验
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Golang开发支持平滑升级(优雅重启)的HTTP服务(转)
HTTP 协议 与 golang web 应用服务
go语言系列-TCP编程
RabbitMQ Golang教程(二)
手把手教你用Go语言打造一款简易TCP端口扫描器
【Go语言入门100题】036 A乘以B (5 分) Go语言|Golang
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服