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 25 Golang
golang中的空slice案例
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
golang slice元素去重操作
Apr 30 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Go语言基础知识点介绍
Jul 04 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang map映射的用法
Apr 22 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
分公司经理岗位职责
2013/11/11 职场文书
小学生获奖感言范文
2014/02/02 职场文书
优秀护士获奖感言
2014/02/20 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
工作感想范文
2015/08/07 职场文书
安全教育主题班会教案
2015/08/12 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
vue使用watch监听属性变化
2022/04/30 Vue.js