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通过递归遍历生成树状结构的操作
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang解析JSON对象
Apr 30 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 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对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python看某个模块的版本方法
2018/10/16 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
小学教师学期末自我评价
2013/09/25 职场文书
好邻里事迹材料
2014/01/16 职场文书
班组长岗位职责
2014/03/03 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
技术入股协议书
2016/03/22 职场文书
倡议书怎么写?
2019/04/11 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技