内容简介:tcp/udp ip通信是当前重要的通信方式。当然对于golang开发者而言,实现tcp通信也是必要的。本文的内容主要是基于《Go语言四十二章经》简书地址:本文的例子分为服务端与客户端两部分:
tcp/udp ip通信是当前重要的通信方式。
当然对于golang开发者而言,实现tcp通信也是必要的。本文的内容主要是基于《Go语言四十二章经》简书地址: https://www.jianshu.com/nb/29056963 的详细讲解
本文的例子分为服务端与客户端两部分:
服务端:
package main import ( "bufio" "fmt" "io" "net" "time" ) //tcp server 服务端代码 func main() { //定义一个tcp断点 var tcpAddr *net.TCPAddr //通过ResolveTCPAddr实例一个具体的tcp断点 tcpAddr,_ = net.ResolveTCPAddr("tcp","127.0.0.1:9999") //打开一个tcp断点监听 tcpListener,_ := net.ListenTCP("tcp",tcpAddr) defer tcpListener.Close() fmt.Println("Server ready to read ...") //循环接收客户端的连接,创建一个协程具体去处理连接 for{ tcpConn,err := tcpListener.AcceptTCP() if err!=nil { fmt.Println(err) continue } fmt.Println("A client connected :" +tcpConn.RemoteAddr().String()) go tcpPipe(tcpConn) } } //具体处理连接过程方法 func tcpPipe(conn *net.TCPConn){ //tcp连接的地址 ipStr := conn.RemoteAddr().String() defer func() { fmt.Println(" Disconnected : " + ipStr) conn.Close() }() //获取一个连接的reader读取流 reader := bufio.NewReader(conn) i:=0 //接收并返回消息 for { message,err := reader.ReadString('\n') if err!=nil || err == io.EOF { break } fmt.Println(string(message)) time.Sleep(time.Second*3) msg := time.Now().String() + conn.RemoteAddr().String() + " Server Say hello! \n" b := []byte(msg) conn.Write(b) i++ if i>10 { break } } }
客户端
package main import ( "bufio" "fmt" "io" "net" "time" ) func main() { var tcpAddr *net.TCPAddr tcpAddr,_ = net.ResolveTCPAddr("tcp","127.0.0.1:9999") conn,err := net.DialTCP("tcp",nil,tcpAddr) if err!=nil { fmt.Println("Client connect error ! " + err.Error()) return } defer conn.Close() fmt.Println(conn.LocalAddr().String() + " : Client connected!") onMessageReceived(conn) } func onMessageReceived(conn *net.TCPConn) { reader := bufio.NewReader(conn) b := []byte(conn.LocalAddr().String() + " Say hello to Server... \n") conn.Write(b) for { msg, err := reader.ReadString('\n') fmt.Println("ReadString") fmt.Println(msg) if err != nil || err == io.EOF { fmt.Println(err) break } time.Sleep(time.Second * 2) fmt.Println("writing...") b := []byte(conn.LocalAddr().String() + " write data to Server... \n") _, err = conn.Write(b) if err != nil { fmt.Println(err) break } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- golang 实现的一个遗传算法的例子
- Colly源码解析——结合例子分析底层实现
- 初识Kubernetes(K8s):从一个单机部署实现Java Web应用例子开始
- 一个例子了解迁移学习
- oracle审计例子
- 弹性盒模型常见例子
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链核心算法解析
【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00
《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!