内容简介: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审计例子
- 弹性盒模型常见例子
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
WEBMASTER技术手册
斯潘奥尔 / 斯潘奥尔 / 清华大学出版社 / 2004-4 / 63.0
本书的第三版升级到Apache PHP和Java Script 最新的版本上。同是它还包含了关于mod_perl更为详尽的信息以及提高Web 性能的方法。书中的内容涉及到HTML4.01、CSS、XML和XSLT、JavaScript1.5 、HTTP1.1、A pache2.0等等。一起来看看 《WEBMASTER技术手册》 这本书的介绍吧!