简介

网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也具有一个类似打开文件的函数调用:socket(),该函数返回有一个整形的socket描述符,随后的连接建立,数据传输等操作都是通过它实现的

常用的socket类型有两种:流式socket(SOCK_STREAM)和数据报式socket(SOCK_DGRAM)

  • 流式是一种面向连接的socket,针对面向连接的tcp服务应用
  • 数据报式socket是一种无连接的socket,对应于无连接的udp服务应用


listen创建的socket不用于通信,用于监听地址的,accept的socket是用来通信的

read读服务/客户,有返回0,对端关闭和你连接了

函数

server端
Listen函数

func Listen(network, address string) (Listener, error)

network:tcp或者udp
address:ip端口号比如127.0.0.1:9194或者:8005

Listener接口

type Listener interface {Accept() (Conn, error)Close() errorAddr() Addr
}

Conn接口

type Conn interface {Read(b []byte) (n int, err error)Write(b []byte) (n int, err error)Close() errorLocalAddr() AddrRemoteAddr() AddrSetDeadline(t time.Time) errorSetReadDeadline(t time.Time) errorSetWriteDeadline(t time.Time) error
}

tcp服务代码

func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把监听关闭defer listener.Close()//阻塞等待用户链接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)continue}//接收用户的请求//1024缓冲区buf := make([]byte, 1024)n, err1 := conn.Read(buf)if err1 != nil {fmt.Println("err1 = ", err1)continue}fmt.Println("buf = ", string(buf[:n]))//关闭当前用户的连接defer conn.Close()}
}

tcp客户端

func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("err = ", err)return}defer conn.Close()//发送数据conn.Write([]byte("are u ok?"))
}

服务端多人

用nc做客户端,telnet做客户端好像会多传东西

func HandleConn(conn net.Conn) {//获取客户端的网络地址信息addr := conn.RemoteAddr().String()fmt.Println("连接成功: ", addr)//关闭连接defer conn.Close()buf := make([]byte, 2048)for {//读取用户数据,如果客户端关闭了,好像是能发现这边的n是等于0的n, err := conn.Read(buf)if err != nil {//客户端意外关闭,也能发现fmt.Println("err = ", err)return}//打印数据fmt.Println("数据是: ", string(buf[:n]))//看里面多了哪些东西fmt.Println("长度是: ", len(string(buf[:n])))//因为客户端传递来的有\nif "exit" == string(buf[:n-1]) {fmt.Println(addr, " exit")return}//把数据转化为大写再发送conn.Write([]byte(strings.ToUpper(string(buf[:n]))))}
}func main() {listener, err := net.Listen("tcp", "0.0.0.0:8183")if err != nil {fmt.Println("err = ", err)return}//退出前把监听关闭defer listener.Close()//阻塞等待用户链接for {conn, err := listener.Accept()if err != nil {fmt.Println("err = ", err)return}//处理用户请求go HandleConn(conn)}
}

可输入回复客户端

func main() {conn, err := net.Dial("tcp", "127.0.0.1:8183")if err != nil {fmt.Println("net.Dial err = ", err)return}//main调用完毕,关闭连接defer conn.Close()//接收服务器回复的数据go func() {//从键盘输入内容,给服务器发送内容str := make([]byte, 1024)for {n, err := os.Stdin.Read(str)if err != nil {fmt.Println("错误信息是: ", err)return}//把输入的内容发给服务器conn.Write(str[:n])}}()//切片缓冲buf := make([]byte, 1024)for {//如果服务端关闭和你连接,这边的n是能读取到0的n, err := conn.Read(buf)if err != nil {fmt.Println("错误信息是: ", err)return}fmt.Println(string(buf[:n]))}
}

golang中的socket相关推荐

  1. golang中tcp socket粘包问题和处理

    http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格 ...

  2. Go实战--golang中使用redis(redigo和go-redis/redis这个已测试)

    自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/wangshubo1989/article/de ...

  3. golang中http协议实现

    golang中http协议实现 写了一个爬虫,发现出现了socket泄露的情况.百度了一下发现是缺少了Response.Body.Close(),所以导致连接 没有被正常的关闭.也没有被gc回收.下面 ...

  4. Linux Signal及Golang中的信号处理

    转载地址:https://colobu.com/2015/10/09/Linux-Signals/ 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方 ...

  5. exec go 重启_[译]Golang中的优雅重启

    声明:本文目的仅仅作为个人mark,所以在翻译的过程中参杂了自己的思想甚至改变了部分内容,其中有下划线的文字为译者添加.但由于译者水平有限,所写文字或者代码可能会误导读者,如发现文章有问题,请尽快告知 ...

  6. 记一次golang中sync.Map并发创建、读取的问题

    记一次golang中sync.Map并发创建.读取的问题  cunfate https://www.jianshu.com/p/f472e79909bc 背景: 我们有一个用go做的项目,其中用到了z ...

  7. Golang中Wesocket的使用

    Golang中Wesocket的使用 文章目录 Golang中Wesocket的使用 一.什么是WebSockets 二.第三方包实现 1.Go 中的 WebSockets 2.JavaScript ...

  8. 用.net中的socket实现文件传输

    socket是网络套接字,使用它我们可以很方便的实现网络的数据传输.在.net中提供了socket类来帮助开 发者调用socket的使用,从而避免了调用socket的动态库来实现socket的麻烦.下 ...

  9. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

最新文章

  1. 图解深度强化学习(简单的)
  2. 普通人也要学python吗-普通人学Python有意义吗?
  3. dalvik虚拟机执行流程_程序员必备的一些流程图
  4. 6款国内外SNS开源软件 搭建社交网站利器
  5. [react] react父子组件如何通信?
  6. 百练 Let it Bead
  7. 适用于数据科学家的Kubernetes,Linux原理,对硬件问题进行故障排除,Python等
  8. STM32F103:二.(6)mrc522卡号读取
  9. 【Flink】Flink如何传递JVM参数给JobManager和TaskManager
  10. 8.11 NOIP模拟测试17 入阵曲+将军令+星空
  11. 互联网十几年 我们错失了哪些创业机会
  12. Spark2.x详解
  13. Ambari安装和汉化(转)
  14. 科研的常用软件高效神器
  15. Win10系统重装教程(纯净版)
  16. JavaWEB复习汇总
  17. Office Visio 2013、Office Project Pro 2013 简体中文大客户版32位、64位下载
  18. AWS-EC2域名映射
  19. golang 单元测试和性能测试
  20. win10邮件同步出错

热门文章

  1. 【计算理论】可判定性 ( 计算模型与语言 | 区分 可计算语言 与 可判定语言 | 证明 通用图灵机语言是 可计算语言 | 通用任务图灵机 与 特殊任务图灵机 )
  2. 【Android 应用开发】Android 图表绘制 achartengine 示例解析
  3. 洛谷1226快速幂模板
  4. CCF 201703-3 Markdown
  5. JAVA基础代码分享--模拟人机猜拳系统
  6. python 用twisted 问题 zope.interface
  7. win2003系统+IIS6下,经常出现w3wp.exe和sqlserver.exe的内存占用居高不下
  8. int main(int argc,char* argv[])详解(原)
  9. android_Snake
  10. 如何在服务器端写关闭窗口的代码?同时能够更新父窗口?