您现在的位置是:首页 > 学习笔记 > Go语言Go语言
Golang之网络编程
冰山2019-02-25【Go语言】人已围观
简介1.协议
1.1协议
1.2典型协议
2.层与协议
2.1分层方式
3.通信过程
4.Socket编程
5.网络应用程序设计模式
5.1模式介绍
5.2优缺点
6.TCP通信 C/S模型通信
7.UDP通信 C/S模型通信
8.TCP通信并发C/S模型通信
9.UDP通信并发C/S模型通信
10.UDP与TCP的差异
if err!=nil{
fmt.Println("listen udp err",err)
return
}
buf:=make([]byte,4096)
n,addr,err:=conn.ReadFromUDP(buf)
fmt.Println("从客户端中读取",string(buf[:n]))
}
7.2UDP通信 Client 端
udp客户端的编写与TCP客户端的编写,基本上是一样的,只是将协议换成udp,注意只能使用小写。
package main,
import (
"net"
"fmt"
)
func main() {
conn,err:=net.Dial("udp","127.0.0.1")
if err!=nil{
fmt.Println("dial err",err)
return
}
defer conn.Close()
_,err=conn.Write([]byte("客户端发出的信息"))
if err!=nil{
fmt.Println("write err",err)
return
}
}
8.TCP通信并发C/S模型通信
8.1TCP通信 并发Server端
现在已经完成了客户端与服务端的通信,但是服务端只能接收一个用户发送过来的数据,怎样接收多个客户端发送过来的数据,实现一个高效的并发服务器呢?
Accept()函数的作用是等待客户端的链接,如果客户端没有链接,该方法会阻塞。如果有客户端链接,那么该方法返回一个Socket负责与客户端进行通信。所以,每来一个客户端,该方法就应该返回一个Socket与其通信,因此,可以使用一个死循环,将Accept()调用过程包裹起来。
需要注意的是,实现并发处理多个客户端数据的服务器,就需要针对每一个客户端连接,单独产生一个Socket,并创建一个单独的goroutine与之完成通信。
package main
import (
"net"
"fmt"
)
func Handle(conn net.Conn) {
buf:=make([]byte,4096)
n,err:=conn.Read(buf)
if err!=nil{
fmt.Println("read err",err)
return
}
messsage:=buf[:n]
fmt.Println("%d服务器端发来信息%s",conn.RemoteAddr(),messsage)
}
func main() {
listen, err := net.Listen("tcp", "127.0.0.1")
if err != nil {
fmt.Println("listen err", err)
return
}
defer listen.Close()
for {
conn,err:=listen.Accept()
if err!=nil{
fmt.Println("accept err",err)
return
}
go Handle(conn)
}
}
8.2TCP通信 并发Client端
客户端不仅需要持续的向服务端发送数据,同时也要接收从服务端返回的数据,因此可将发送和接收放到不同的协程中。
主协程循环接收服务器回发的数据(该数据应已转换为大写),并打印至屏幕;子协程循环从键盘读取用户输入数据,写给服务器。读取键盘输入可使用 os.Stdin.Read(str)。定义切片str,将读到的数据保存至str中。
这样,客户端也实现了多任务。
package main
import (
"net"
"fmt"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1")
if err != nil {
fmt.Println("dial err", err)
微信扫一扫~
支付宝扫一扫~
很赞哦! ()
上一篇:Go并发
相关文章
随机图文
go操作数据库之gorm
gorm的简单Demo的实例数据格式
1.数组 1.1数组定义 1.2数组赋值 1.3数组初始化 1.4 数组冒泡排序 1.5数组作为函数参数 2.切片 2.1切片定义 2.2切片定义方式 2.3切片截取 2.4 copy函数的使用 2.5切片作为函数参数 3.字符串处理 4.字符串转化 5.Map 5.1Map初始化 5.2 打印输出 6.结构体 6.1顺序初始化 6.2结构体比较与赋值 6.3结构体数组 6.4结构体作为函数参数 7.指针 7.1指针变量 7.2new函数 7.3指针做函数Git常用基本用法
Git请求合并说明如今公司很多新项目都采取merge request方式来进行code review、非阻塞上线部署,因此掌握merge request很有必要,步骤如下: 1、现在本地用创建一个本地分支,git面向对象
1.匿名字段 1.1匿名字段创建与初始化 1.2同名字段 1.3指针类型匿名字段 2.方法 2.1基本方法创建 2.2给结构体添加方法 2.3指针变量的方法值 2.4方法继承 2.5方法重写 3.接口 3.1接口实现 3.2多态 3.3接口实例 3.4接口继承与转换 3.5空接口