博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang实现简单tcp服务器02 -- 实现echo服务器/客户端
阅读量:6705 次
发布时间:2019-06-25

本文共 2467 字,大约阅读时间需要 8 分钟。

hot3.png

用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服务器/客户端就实现了

相关源码:

转载于:https://my.oschina.net/u/174175/blog/424050

你可能感兴趣的文章
用Python脚本定制自己的Web服务器
查看>>
python判断字符串(string)是否包含(contains)子字符串的方法
查看>>
批量授权、零售版和OEM的区别
查看>>
01-扫描-使用nmap端口扫描
查看>>
Windows Server 2012 R2 路由功能部署
查看>>
软件应用程序的打包和部署
查看>>
RocketMQ双Master集群搭建
查看>>
优秀Java程序员必备10招
查看>>
shell编程函数与数组
查看>>
手机助手之搞怪
查看>>
nodejs安装
查看>>
TCP/IP7层模型
查看>>
现代软件工程 第八章 【需求分析】练习与讨论
查看>>
Android开发网上的一些重要知识点_3
查看>>
如何在Xendesktop的Desktop Director实现XP或者win7的重影
查看>>
web.xml 中的listener、 filter、servlet 加载顺序及其详解
查看>>
windows 8 使用序列号
查看>>
apache 的编译安装
查看>>
个税申报专项扣除申报
查看>>
如何解决邮件内容乱码的问题
查看>>