GO语言网络编程
Posted aresxin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO语言网络编程相关的知识,希望对你有一定的参考价值。
socket编程
Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket后面,对用户来说只需要调用Socket规定的相关函数,让Socket去组织符合指定的协议数据然后进行通信。
GO语言实现TCP通信
TCP协议
TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。
TCP服务端
一个TCP服务端可以同时连接很多个客户端,Go语言中创建多个goroutine实现并发非常方便和高效,所以可以每建立一次链接就创建一个goroutine去处理。
TCP服务端程序的处理流程:
- 监听端口
- 接收客户端请求建立链接
- 创建goroutine处理链接
TCP服务端:
//TCP server端
func process(conn net.Conn)
defer conn.Close() //关闭连接
for
reader := bufio.NewReader(conn)
var buf [128]byte
n,err := reader.Read(buf[:]) //读取数据
if err != nil
fmt.Println("连接客户端失败,错误信息:",err)
recvStr := string(buf[:n])
fmt.Println("收到客户端信息:",recvStr)
conn.Write([]byte(recvStr)) //发送数据
func main()
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil
fmt.Println("监听失败,错误:",err)
return
for
conn,err := listen.Accept() //建立连接
if err!= nil
fmt.Println("建立连接失败,错误:",err)
continue
go process(conn) //启动一个goroutine处理连接
TCP客户端
一个TCP客户端进行TCP通信的流程如下:
- 建立与服务端的链接
- 进行数据收发
- 关闭链接
TCP客户端:
//客户端
func main()
conn ,err := net.Dial("tcp","127.0.0.1:8888")
if err != nil
fmt.Println("连接失败,错误:",err)
return
defer conn.Close()
inputReader := bufio.NewReader(os.Stdout)
for
input, _ := inputReader.ReadString('\\n') //读取用户输入
inputInfo := strings.Trim(input,"\\r\\n")
if strings.ToUpper(inputInfo) == "q"
return //如果输入q就退出
_,err = conn.Write([]byte(inputInfo)) //发送数据
if err != nil
return
buf := [512]byte
n,err := conn.Read(buf[:])
if err != nil
fmt.Println("接受失败,错误:",err)
return
fmt.Println(string(buf[:n]))
先启动server,后启动client:
$go run main.go
我是客户端
我是客户端
$go run main.go
收到客户端信息: 我是客户端
GO语言实现UDP通信
UDp协议
UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。
UDP服务端
//服务端
func main()
listen,err := net.ListenUDP("udp",&net.UDPAddr
IP:net.IPv4(0,0,0,0),
Port:8888,
)
if err != nil
fmt.Println("监听失败,错误:",err)
return
defer listen.Close()
for
var data [1024]byte
n,addr,err := listen.ReadFromUDP(data[:])
if err != nil
fmt.Println("接收udp数据失败,错误:",err)
continue
fmt.Printf("data:%v addr:%v count:%v\\n", string(data[:n]), addr, n)
_ ,err = listen.WriteToUDP(data[:n],addr) //发送数据
if err != nil
fmt.Println("发送数据失败,错误:",err)
continue
UDP客户端
//客户端
func main()
socket,err := net.DialUDP("udp",nil,&net.UDPAddr
IP:net.IPv4(0,0,0,0),
Port:8888,
)
if err != nil
fmt.Println("连接服务器失败,错误:",err)
return
defer socket.Close()
sendData := []byte("hello world!")
_,err = socket.Write(sendData)
if err != nil
fmt.Println("发送数据失败,错误:",err)
return
data := make([]byte,4096)
n,remoteAddr,err := socket.ReadFromUDP(data)
if err != nil
fmt.Println("接受数据失败,错误:",err)
return
fmt.Printf("recv:%v addr:%v count:%v\\n", string(data[:n]), remoteAddr, n)
先启动server,后启动client:
$go run main.go
recv:hello world! addr:127.0.0.1:8888 count:12
$go run main.go
data:hello world! addr:127.0.0.1:51222 count:12
HTTP客户端和服务端
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收html页面的方法。
HTTP服务端
net/http包是对net包的进一步封装,专门用来处理HTTP协议的数据。
// http server
func sayHi(w http.ResponseWriter,r *http.Request)
fmt.Fprintln(w,"你好,ares!")
func main()
http.HandleFunc("/",sayHi)
err := http.ListenAndServe(":8888",nil)
if err != nil
fmt.Println("Http 服务建立失败,err:",err)
return
?
HTTP客户端
func main()
resp, err := http.Get("https://www.baidu.com/")
if err != nil
fmt.Println("get failed, err:", err)
return
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Printf("%T\\n",body)
fmt.Println(string(body))
执行之后就能在终端输出www.baidu.com网站首页的内容了。
以上是关于GO语言网络编程的主要内容,如果未能解决你的问题,请参考以下文章