Go语言 详解net的tcp服务


Posted in Golang onApril 14, 2022

服务端监听端口 listen()

方法:net.listen({监听类型},{监听的ip和端口})(conn, err){}

返回值:conn是监听的对象,有获取消息关闭监听等方法err错误信息,如果没有错误信息值为nil

import ("net"
"fmt"
)
conn,err := net.Lisien("tcp","127.0.0.1:8082")
if err != nil{
  fmt.Println("链接失败,错误信息为:"+err)
}

接受客户端的链接conn.Accept()

方法:conn.Accept() (newConn,err){} 返回值: newConn客户端的链接对象,类型为net.Conn.存放了客户端的链接信息,和与客户端交互的方法.err存放错误,如果没有错误信息值为nil 注意点: Accept()方法会阻塞,直到有链接过来

//  ...上面的代码...
// 因为客户端的链接不止一个,需要一直监听,所以加个死循环
for{
    newConn,err := conn.Accept()
    if err != nil{
        fmt.Println(err)
    }
    go handler(newConn)
}
​
// 客户端连接后处理逻辑
func handler(newConn net.Conn){
    // TODO
}

接收客户端发过来的数据newConn.Read()

方法:newConn.Read(msg)(num,err){}

返回值: num数据内容的长度,单位字节err错误信息,如果没有错误信息值为nil

注意点: 参数msg是一个byte类型的切片,用来保存客户端发送的数据。Read方法同样会阻塞!!

// ...上上边代码补充...
// 客户端连接后处理逻辑
func handler(newConn net.Conn){
    for{
        // 新建一个位置用于存放客户端数据
        msg := make([]byte,1024)
        num,err := newConn.Read(msg)
        if err != nil{
            // 打印错误信息
        }
        fmt.Println("客户端消息:"+msg)
    }
    
}

获取客户端的IP地址newConn.RemoteAddr().String()

// 获取ip地址,转为之字符串
newConn.RemoteAddr().String()

向客户端发送数据newConn.Write()

方法:newConn.Write(msg){}

参数:msg类型为[]byte

注意点:需要把待发送的字符串转为byte切片类型

newConn.Write([]bye("你好世界,helloworld1"))

关闭客户端连接newConn.Close()

方法: newConn.Close(){}

在客户端连接的返回的对象上调用Close()方法即可

newConn.Close()

客户端连接tpc服务端

连接服务端net.Dial()

方法: net.Dial({连接类型},{地址})(conn,err){}

放回值: conn连接成功后的连接对象,err连接出错时的错误信息,如果没有错误信息,返回nil

// 建立tcp连接
package main
import (
    "net"
    "fmt"
)
Ip,Port := "127.0.0.1",8081
conn,err := net.Dial("tcp",fmt.Sprintf("%s:%d",Ip,Port))
if err != nil{
    fmt.Println("net.Dial 错误:",err)
    return nil
}
if(conn == nil){
    fmt.Println(">>>>>>>>连接错误")
    return
}
fmt.Println(">>>>>>>>连接成功")

运行: 

Go语言 详解net的tcp服务

到此这篇关于golang中net的tcp服务使用的文章就介绍到这了!

Golang 相关文章推荐
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
深入理解go slice结构
Sep 15 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang为什么要统一错误处理
Apr 03 Golang
深入理解 Golang 的字符串
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
golang连接MySQl使用sqlx库
Apr 14 #Golang
Go语言安装并操作redis的go-redis库
Apr 14 #Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 #Golang
Go语言grpc和protobuf
Golang流模式之grpc的四种数据流
Apr 13 #Golang
Golang数据类型和相互转换
Apr 12 #Golang
Go语言的协程上下文的几个方法和用法
Apr 11 #Golang
You might like
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
python调用Delphi写的Dll代码示例
2017/12/05 Python
git进行版本控制心得详谈
2017/12/10 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Python坐标线性插值应用实现
2019/11/13 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Python多线程thread及模块使用实例
2020/04/28 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
给排水工程师岗位职责
2013/11/21 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
个人总结与自我评价
2014/09/18 职场文书
授权委托书范本(单位)
2014/09/28 职场文书