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 相关文章推荐
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Go语言中的UTF-8实现
Apr 26 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang解析JSON对象
Apr 30 Golang
Golang 入门 之url 包
May 04 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python XML RPC服务器端和客户端实例
2014/11/22 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
python实现贪吃蛇游戏
2020/03/21 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python打印异常信息的两种实现方式
2019/12/24 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
水利学院求职自荐书
2014/02/01 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
运动会演讲稿50字
2014/08/25 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
总账会计岗位职责
2015/04/02 职场文书
AJAX学习笔记
2021/05/18 Javascript