Server端常用函数、接口:

Listen函数:func Listen(network, address string) (Listener, error)network:选用的协议:TCP、UDP,    如:“tcp”或 “udp”address:IP地址+端口号,          如:“127.0.0.1:8000”或 “:8000”Listener 接口:
type Listener interface {Accept() (Conn, error)Close() errorAddr() Addr
}Conn 接口:
type Conn interface {Read(b []byte) (n int, err error)Write(b []byte) (n int, err error)Close() errorLocalAddr() AddrRemoteAddr() AddrSetDeadline(t time.Time) errorSetReadDeadline(t time.Time) errorSetWriteDeadline(t time.Time) error
}

TCP-服务端实现:

func main() {// 指定服务器的通讯协议、ip、端口,Listen本身不做监听,这一步是创建了一个用于监听的Socketlisten, err := net.Listen("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("net.Listen出错:", err)return}defer listen.Close()fmt.Println("服务器启动完毕,等待客户端连接")// 阻塞监听客户端连接请求,成功建立连接后会返回用于通信的Socketaccept, err := listen.Accept()if err != nil {fmt.Println("listen.Accept出错:", err)return}defer accept.Close()fmt.Println("服务器与客户端连接成功")// 读取客户端发动的请求buf := make([]byte, 4096)read, err := accept.Read(buf)if err != nil {fmt.Println("accept.Read出错:", err)return}// 接收数据后处理数据fmt.Println("服务器获取到:", string(buf[:read]))
}

Mac可以通过netcat进行测试:

TCP-客户端实现:

func main() {// 指定用户端的通讯协议、ip、端口,Listen本身不做监听,这一步是创建了一个用于监听的Socketdial, err := net.Dial("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("net.Dial出错:", err)return}defer dial.Close()// 发送数据dial.Write([]byte("我是客户端"))// 接收服务器返回的数据buf := make([]byte, 4096)read, err := dial.Read(buf)if err != nil {fmt.Println("accept.Read出错:", err)return}// 接收数据后处理数据fmt.Println("客户端获取到:", string(buf[:read]))
}

TCP实现并发-服务器:

上面都是单机版的客户端通信,如果想要实现并发,需要使用Goroutine+循环实现

  • 循环读取客户端发送的数据
  • 如果客户端强制关闭连接需要做处理
  • 客户端发送exit时

演示:

package mainimport ("fmt""net""strings"
)func main() {// 创建监听套接字listen, err := net.Listen("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("net.Listen出错:", err)return}defer listen.Close()// 创建客户端连接请求fmt.Println("服务器启动成功,等待客户端连接!")for {accept, err := listen.Accept()if err != nil {fmt.Println("listen.Accept出错:", err)return}// 调用服务器和客户端通信的函数go HandlerConnect(accept)}
}func HandlerConnect(accept net.Conn) {defer accept.Close()// 获取客户端发送的数据// 获取连接客户端的网络地址addr := accept.RemoteAddr()fmt.Println(addr, "客户端连接成功!")buf := make([]byte, 4096)for {read, err := accept.Read(buf)if err != nil {fmt.Println("accept.Read出错:", err)return}fmt.Println("服务器读到数据:", string(buf[:read]))// 模拟服务器收到数据后,回发给客户端,小写转大写data := strings.ToUpper(string(buf[:read]))accept.Write([]byte(data))}
}

TCP实现并发-客户端:

演示:

package mainimport ("fmt""net""os"
)func main() {//主动发送连接请求dial, err := net.Dial("tcp", "127.0.0.1:8000")if err != nil {fmt.Println("et.Dial出错了", err)return}defer dial.Close()// os.Stdin():获取用户键盘录入,go func() {str := make([]byte, 4096)for {read, err := os.Stdin.Read(str)if err != nil {fmt.Println("os.Stdin.Read出错了", err)continue}// 读到的数据写给服务器,读多少写多少dial.Write(str[:read])}}()buf := make([]byte, 4096)// 回显服务器发送的数据,转成大写for {read, err := dial.Read(buf)// read=0的说明对端关闭连接,如果关闭连接这里就不需要往下读数据了if read == 0 {fmt.Println("检测到服务端端已经断开连接!")return}if err != nil {fmt.Println("回显服务器发送的数据dial.Read出错了", err)return}fmt.Println("客户端读到服务器的回显数据", string(buf[:read]))}
}

UDP实现并发-服务器:

由于UDP是“无连接”的,所以,服务器端不需要额外创建监听套接字,只需要指定好IP和port,然后监听该地址,等待客户端与之建立连接,即可通信。

创建监听地址:

 func ResolveUDPAddr(network, address string) (*UDPAddr, error)

创建监听连接:

 func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, error)

接收udp数据:

 func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error)

写出数据到udp:

 func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error)

演示:

package mainimport ("fmt""net"
)func main() {// 指定服务器的ip和端口,和TCP协议不一样,需要先写好再传给ListenUDP使用ServerAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")if err != nil {fmt.Println("net.ResolveUDPAddr err:", err)return}fmt.Println("服务器启动成功!")// 创建用户通信的SocketudpConnect, err := net.ListenUDP("udp", ServerAddr)if err != nil {fmt.Println("net.ListenUDP err:", err)return}defer udpConnect.Close()fmt.Println("服务器创建Socket成功!")// 读写客户端的数据buf := make([]byte, 4096)count := 0for {// 返回值:n int(读到的字节数), addr *UDPAddr(客户端的地址), err errorudpBytes, ConnectAddr, err := udpConnect.ReadFromUDP(buf)if err != nil {fmt.Println("udpConnect.ReadFromUDP err:", err)return}count++// 模拟处理数据fmt.Printf("服务器读到第%v条数据 %v :%s\n", count, ConnectAddr, string(buf[:udpBytes]))go func() {// 回写数据到客户端udpConnect.WriteToUDP([]byte("回写数据到客户端\n"), ConnectAddr)}()}
}

UDP实现并发-客户端:

package mainimport ("fmt""net""time"
)func main() {dial, err := net.Dial("udp", "127.0.0.1:8000")if err != nil {fmt.Println("net.Dial出错:", err)return}defer dial.Close()for {// 发送数据dial.Write([]byte("我是客户端"))// 接收服务器返回的数据buf := make([]byte, 4096)read, err := dial.Read(buf)if err != nil {fmt.Println("accept.Read出错:", err)return}// 接收数据后处理数据fmt.Println("客户端获取到:", string(buf[:read]))time.Sleep(time.Second)}
}

Golang——TCP、UDP实现并发(服务端与客户端)相关推荐

  1. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  2. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  3. 【计算机网络】服务端和客户端最大支持多少tcp连接?如何分析?

    文章目录 (一)引用文章 (二)简单分析: 1.基本概念:TCP四元组 2.多个客户端连接一个服务端最大支持最大多少tcp连接? 3.一个客户端连接一个服务端最大支持多少个tcp连接? (二)全面分析 ...

  4. TCP协议服务端与客户端

    一.TCP/IP协议简介 什么是TCP/IP TCP/IP协议是一种用于因特网的通信协议.TCP指传输控制协议(Transmission Control Protocol),IP指网际协议(Inter ...

  5. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  6. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  7. C#创建TCP/IP服务端和客户端,含测试demo及源码

    网上的TCP/IP创建服务端和客户端的方法鱼龙混杂,自己把在使用项目中的TCP服务端和客户端的代码抽了出来,做了demo,以供大家使用参考. 为了方便调用,我把一些基础方法都整合封装到了Reader. ...

  8. netty tcp服务端主动断开客户端_【Netty】服务端和客户端

    欢迎关注公众号:[爱编程] 如果有需要后台回复2019赠送1T的学习资料哦!! 本文是基于Netty4.1.36进行分析 服务端 Netty服务端的启动代码基本都是如下: private void s ...

  9. 高并发服务端分布式系统设计概要(上)

    高并发服务端分布式系统设计概要(上) ======张峻崇 原创.转载请注明出处.====== 又是快一年没写博客了,2013年也只剩尾巴,也不知道今年都忙了些什么.写这篇文章的目的,主要是把今年以来学 ...

  10. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

最新文章

  1. c# 实现文本读取,语音报警功能
  2. flutter 泛型_Flutter/Dart - 泛型
  3. 漫画:设计模式之 “外观模式”
  4. Java 命令行编译项目
  5. LeetCode:204. 计数质数
  6. asp.net core 教程(六)-中间件
  7. Linux设备树语法详解【转】
  8. 等保2.0标准下,测评中重点关注的内容
  9. python writelines_Python文件writelines()方法
  10. 你有什么难忘的出差经历?
  11. 德标螺纹规格对照表_德标等螺纹对照表
  12. Linux系列之Linux安装及源配置(软件源)的介绍
  13. 麦克斯韦方程组(彩图完美解释版)
  14. 基于java+jsp房屋租赁管理系统
  15. python乌龟吃鱼_Python面向对象练习-通过pygame改良乌龟吃鱼
  16. 程序员有话说 | 我成了敲代码的“佛教徒”
  17. Spring Cloud Gateway Session
  18. Elasticsearch 7.9 之 Frozen indices
  19. CMOS相机和CCD相机的区别
  20. torch对于tensor的常规操作

热门文章

  1. 火车头php接口制作,火车头接口
  2. c语言英文星期几,输入字母,判断星期几,求大神指点
  3. Node.js Event loop 图解
  4. Java 遍历系统根目录
  5. file数组 删除文件_java编程IO基础之一:File类
  6. html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析
  7. win10推送_Win10推送更新升级Edge浏览器:用户发现电脑速度因此变慢
  8. 奇异值分解SVD(证明全部省略)
  9. etcd 启动分析_Etcd 架构与实现解析
  10. word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符