iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言实现UDP协议及TCP通讯
  • 752
分享到

Go语言实现UDP协议及TCP通讯

2024-04-02 19:04:59 752人浏览 独家记忆
摘要

⼀、使用golang创建⼀一个tcp连接 1.服务端处理理流程 a.监听端口b.接受客户端的链接c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goro

⼀、使用golang创建⼀一个tcp连接

1.服务端处理理流程

  • a.监听端口
  • b.接受客户端的链接
  • c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goroutine⾮常简单)

题外话:要是用Java、C#服务这边每⼀个请求都开⼀个线程处理的话,顶多⼏千个,但是Goroutine就⾮常简单。

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    //1.建立监听端口
    listen, err := net.Listen("tcp", "0.0.0.0:20000")
    if err != nil {
        fmt.Println("listen failed, err:", err)
        return
    }
 
    fmt.Println("listen Start...:")
 
    for {
        //2.接收客户端的链接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Printf("accept failed, err:%v\n", err)
            continue
        }
        //3.开启一个Goroutine,处理链接
        go process(conn)
    }
}
 
//处理请求,类型就是net.Conn
func process(conn net.Conn) {
 
    //处理结束后关闭链接
    defer conn.Close()
    for {
        var buf [128]byte
        n, err := conn.Read(buf[:])
        if err != nil {
            fmt.Printf("read from conn failed, err:%v", err)
            break
        }
        fmt.Printf("recv from client, content:%v\n", string(buf[:n]))
    }
 
}

2.客户端处理流程

  • a.和服务端建立一个链接
  • b.进行数据的收发
  • c.关闭链接
package main
 
import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)
 
func main() {
    //1.建立一个链接(Dial拨号)
    conn, err := net.Dial("tcp", "0.0.0.0:20000")
    if err != nil {
        fmt.Printf("dial failed, err:%v\n", err)
        return
    }
 
    fmt.Println("Conn Established...:")
 
    //读入输入的信息
    reader := bufio.NewReader(os.Stdin)
    for {
        data, err := reader.ReadString('\n')
        if err != nil {
            fmt.Printf("read from console failed, err:%v\n", err)
            break
        }
 
        data = strings.TrimSpace(data)
        //传输数据到服务端
        _, err = conn.Write([]byte(data))
        if err != nil {
            fmt.Printf("write failed, err:%v\n", err)
            break
        }
    }
}

执⾏⼀下:

客户端:

服务端:

⼆、使用Golang创建⼀个Http连接

  • A.HTTP协议是基于TCP协议之上的⽂本协议。
  • B.每行⽂本使⽤\r\n结尾,当连续两个\r\n时,表示整个数据包结束。
package main
 
import (
    "fmt"
    "io"
    "net"
)
 
func main() {
    conn, err := net.Dial("tcp", "www.baidu.com:80")
    if err != nil {
        fmt.Printf("dial failed, err:%v\n", err)
        return
    }
 
    data := "GET / HTTP/1.1\r\n"
    data += "HOST: www.baidu.com\r\n"
    data += "connection: close\r\n"
    data += "\r\n\r\n"
 
    //写入数据
    _, err = io.WriteString(conn, data)
    if err != nil {
        fmt.Printf("wirte string failed, err:%v\n", err)
        return
    }
 
    var buf [1024]byte
    for {
        //读取返回的数据
        n, err := conn.Read(buf[:])
        if err != nil || n == 0 {
            break
        }
 
        fmt.Println(string(buf[:n]))
    }
}

三、使⽤用Golang创建⼀个UDP连接

1.服务流程,相比于TCP连接需要Accept一个链接,UDP不需要进⾏这步操作,服务端代码如下:

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    //建立一个UDP的监听,这里使用的是ListenUDP,并且地址是一个结构体
    listen, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Printf("listen failed, err:%v\n", err)
        return
    }
 
    for {
        var data [1024]byte
        //读取UDP数据
        count, addr, err := listen.ReadFromUDP(data[:])
        if err != nil {
            fmt.Printf("read udp failed, err:%v\n", err)
            continue
        }
 
        fmt.Printf("data:%s addr:%v count:%d\n", string(data[0:count]), addr, count)
        //返回数据
        _, err = listen.WriteToUDP([]byte("hello client"), addr)
        if err != nil {
            fmt.Printf("write udp failed, err:%v\n", err)
            continue
        }
    }
}

2.客户端流程

package main
 
import (
    "fmt"
    "net"
)
 
func main() {
    // 创建连接
    Socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
        IP:   net.IPv4(127, 0, 0, 1),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("连接失败!", err)
        return
    }
    defer socket.Close()
    // 发送数据
    senddata := []byte("hello server!")
    _, err = socket.Write(senddata)
    if err != nil {
        fmt.Println("发送数据失败!", err)
        return
    }
    // 接收数据
    data := make([]byte, 4096)
    read, remoteAddr, err := socket.ReadFromUDP(data)
    if err != nil {
        fmt.Println("读取数据失败!", err)
        return
    }
    fmt.Println(read, remoteAddr)
    fmt.Printf("%s\n", data)
}

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

您可能感兴趣的文档:

--结束END--

本文标题: Go语言实现UDP协议及TCP通讯

本文链接: https://www.lsjlt.com/news/165089.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言实现UDP协议及TCP通讯
    ⼀、使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口b.接受客户端的链接c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goro...
    99+
    2022-11-13
  • go语言中的udp协议及TCP通讯实现示例
    目录udp协议server端client端TCP通讯(基本)服务端客户端TCP通讯并发服务器服务端客户端udp协议 server端 package main import ( "f...
    99+
    2022-11-13
  • go语言中的udp协议及TCP通讯怎么配置
    这篇“go语言中的udp协议及TCP通讯怎么配置”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言中的udp协议及TCP...
    99+
    2023-06-30
  • tcp / udp 协议及其实现的soc
    一、tcp协议 1.1 基本知识 特点: 可靠,慢,全双工通信 建立连接时:三次握手 断开连接时:四次挥手 在建立起连接之后 发送的每一条信息都有回执 为了保证数据的完整性,还有重传机制 长连接:会一直占用双方的端口 IO(in...
    99+
    2023-01-31
    协议 tcp udp
  • go语言实现mqtt协议的实践
    目录一、什么是MQTT二、Go语言MQTT服务器Broker的搭建三、Go客户端访问简单API一、什么是MQTT MQTT(Message Queuing Telemetry Tra...
    99+
    2022-11-12
  • linux中shell脚本如何实现tcp/upd协议通讯
    小编给大家分享一下linux中shell脚本如何实现tcp/upd协议通讯,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!linux 设备里面有个比较特殊的文件: ...
    99+
    2023-06-13
  • 如何使用linux shell 脚本实现tcp/upd协议通讯
    本篇内容主要讲解“如何使用linux shell 脚本实现tcp/upd协议通讯”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用linux shell 脚本实现tcp/upd协议通讯”吧!...
    99+
    2023-06-09
  • linux shell 脚本实现tcp/upd协议通讯(重定向应用)
    前几天发了重定向以及管道相关使用方法,今天这里发些很有趣的例子。通过重定向实现基于tcp/udp协议的软件通讯。 linux 设备里面有个比较特殊的文件: /dev/[tcp|upd]/host/port ...
    99+
    2022-06-04
    脚本 重定向 协议
  • Go语言中怎么实现HTTPS加密协议
    Go语言中怎么实现HTTPS加密协议,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Go语言Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况...
    99+
    2023-06-04
  • ​Golang 实现客户端与服务器端UDP协议连接通讯
    我们先说一下UDP的概念和作用 UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一...
    99+
    2023-06-04
  • Golang 实现客户端与服务器端UDP协议连接通讯
    我们先说一下UDP的概念和作用 UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一...
    99+
    2023-06-05
  • go语言如何实现即时通讯聊天室
    本文小编为大家详细介绍“go语言如何实现即时通讯聊天室”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言如何实现即时通讯聊天室”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实现的功能:公聊,私聊,修改用户名...
    99+
    2023-06-30
  • Go语言开源库实现Onvif协议客户端设备搜索
    目录1、前言2、设备搜索思路3、搜索设备Go源码4、问题1、前言 之前我们已经简单介绍过use-go的开源方案,其也是通过其它的开源方案进行的封装,提供了初步的接口,我们这里利用对o...
    99+
    2022-11-13
  • Go语言开源库怎么实现Onvif协议客户端设备搜索
    这篇文章主要讲解了“Go语言开源库怎么实现Onvif协议客户端设备搜索”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言开源库怎么实现Onvif协议客户端设备搜索”吧!1、前言之前我们已...
    99+
    2023-06-30
  • 300行代码实现go语言即时通讯聊天室
    学了2年Java,因为工作原因需要转Golang,3天时间学习了下go的基本语法,做这样一个聊天室小项目来巩固串联一下语法。 实现的功能:公聊,私聊,修改用户名 只用到了四个类: m...
    99+
    2022-11-13
  • Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据 在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如...
    99+
    2022-11-11
  • 在Node.js下如何运用MQTT协议实现即时通讯及离线推送
    小编给大家分享一下在Node.js下如何运用MQTT协议实现即时通讯及离线推送,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作