如今,在不刷新页面的情况下发送消息并获得即时响应在我们看来是理所当然的事情。但是曾几何时,启用实时功能对开发人员来说是一个真正的挑战。开发社区在HTTP长轮询(http long polling)和AJAX上走了很长一段路,但终于还是找到了一种构建真正的实时应用程序的解决方案。

该解决方案以WebSockets的形式出现,这使得在用户浏览器和服务器之间开启一个交互式会话成为可能。WebSocket支持浏览器将消息发送到服务器并接收事件驱动的响应,而不必使用长轮询服务器的方式去获取响应。

就目前而言,WebSockets是构建实时应用程序的首选解决方案,包括在线游戏,即时通讯程序,跟踪应用程序等均在使用这一方案。本文将说明WebSockets的操作方式,并说明我们如何使用

Go语言

构建WebSocket应用程序。我们还将比较最受欢迎的WebSocket库,以便您可以根据选择出最适合您的那个。

网络套接字(network socket)与WebSocket

在Go中使用WebSockets之前,让我们在网络套接字和WebSockets之间划清一条界限。

网络套接字

网络套接字(或简称为套接字)充当内部端点,用于在同一计算机或同一网络上的不同计算机上运行的应用程序之间交换数据。

套接字是Unix和Windows操作系统的关键部分,它们使开发人员更容易创建支持网络的软件。应用程序开发人员不可以直接在程序中包含套接字,而不是从头开始构建网络连接。由于网络套接字可用于许多不同的网络协议(如HTTP,FTP等),因此可以同时使用多个套接字。

套接字是通过一组函数调用创建和使用的,这些函数调用有时称为套接字的应用程序编程接口(API)。正是由于这些函数调用,套接字可以像常规文件一样被打开。

网络套接字有如下几种类型:

  • 数据报套接字(SOCK_DGRAM),也称为无连接套接字,使用用户数据报协议(UDP)。数据报套接字支持双向消息流并保留记录边界。
  • 流套接字(SOCK_STREAM),也称为面向连接的套接字,使用传输控制协议(TCP),流控制传输协议(SCTP)或数据报拥塞控制协议(DCCP)。这些套接字提供了没有记录边界的双向,可靠,有序且无重复的数据流。
  • 原始套接字(或原始IP套接字)通常在路由器和其他网络设备中可用。这些套接字通常是面向数据报的,尽管它们的确切特性取决于协议提供的接口。大多数应用程序不使用原始套接字。提供它们是为了支持新的通信协议的开发,并提供对现有协议更深层设施的访问。

套接字通信

首先,让我们弄清楚如何确保每个套接字都是唯一的。否则,您将无法建立可靠的沟通通道(channel)。

为每个进程(process)提供唯一的PID有助于解决本地问题。但是,这种方法不适用于网络。要创建唯一的套接字,我们建议使用TCP / IP协议。使用TCP / IP,网络层的IP地址在给定网络内是唯一的,并且协议和端口在主机应用程序之间是唯一的。

TCP和UDP是用于主机之间通信的两个主要协议。让我们看看您的应用程序如何连接到TCP和UDP套接字。

  • 连接到TCP套接字

为了建立TCP连接,Go客户端使用net程序包中的DialTCP函数。DialTCP返回一个TCPConn对象。建立连接后,客户端和服务器开始交换数据:客户端通过TCPConn向服务器发送请求,服务器解析请求并发送响应,TCPConn从服务器接收响应。

图:TCP Socket

该连接将持续保持有效,直到客户端或服务器将其关闭。创建连接的函数如下:

客户端:

// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil { // handle error } conn, err := net.DialTCP(network, nil, tcpAddr) if err != nil { // handle error } // send message _, err = conn.Write({message}) if err != nil { // handle error } // receive message var buf [{buffSize}]byte _, err := conn.Read(buf[0:]) if err != nil { // handle error }

服务端:

// init tcpAddr, err := net.ResolveTCPAddr(resolver, serverAddr) if err != nil { // handle error } listener, err := net.ListenTCP("tcp

同一主机的多个子进程使用同一个套接字_如何在Go语言中使用Websockets:最佳工具与行动指南...相关推荐

  1. 同一主机的多个子进程使用同一个套接字_在操作系统中进程是如何通信的

    这是我在毕业时校招阿里系公司时,终面的面试官问我印象最深的一道题,别问,问就是挂了.要是过了早就忘了 首先了解进程是什么 狭义定义就是,进程是一段程序进行的过程. 广义定义:进程是一个具有一定独立功能 ...

  2. ftp同一主机的多个子进程使用同一个套接字_linux进程通信方式对比

    管道: 速度慢,容量有限(64kB,ulimit -a可以查询的pipe size 指的是一次性写入的大小限制),只有父子进程能通讯 半双工的(即数据只能在一个方向上流动)----(匿名管道) int ...

  3. Day4:应用层——网络应用层内容概述、网络应用基本原理(体系结构、进程通信、套接字socket、应用层协议)、Web应用与HTTP

    加油!寒假偷博人 一.网络应用层内容概述. 1本篇内容:(原理.实例.编程) 网络应用体系结构 客户机/服务器  P2P  混合结构 网络应用的服务需求 可靠性 带宽 时延 Inte ...

  4. select 实现类似多线程_linux进程通信--socket套接字(四)--多路IO转实现一个server对应多个client...

    先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 一 why 在前 ...

  5. 怎样在表格中选出同一类_如何在excel表格中同一个框选择下一行 - 卡饭网

    在excel表格中怎样设置选择下拉列表? 在excel表格中怎样设置选择下拉列表? 在excel表格制作中,经常会遇到固定选项输入,例如性别( 男  女),婚否(是, 否),在制作考勤表的时候也可以利 ...

  6. Linux编程:多个子进程与父进程使用匿名管道读写

    编写程序,在程序中父进程先后创建子进程1和子进程2.父子三个进程并发执行,并利用同一个匿名管道通信:两个子进程分别向管道写一则信息(内容自定,但要求包含子进程信息):父进程从管道读出信息并显示出来(要 ...

  7. 如何在bash中等待多个子进程完成并在任何子进程以代码!= 0结尾时返回退出代码!= 0?

    如何在bash脚本中等待从该脚本派生的多个子进程完成并返回退出代码!= 0,当任何子进程以代码!= 0结尾时? 简单脚本: #!/bin/bash for i in `seq 0 9`; dodoCa ...

  8. linux创建多个子进程,[Linux进程]使用fork函数创建多个子进程

    #include #include int main (void) { pid_t pid1,pid2;   //进程标识符 pid1 = fork();      //创建一个新的进程 if(pid ...

  9. 默认子进程与父进程属于同一个进程组,所以注意对接受到的信号的处理方式

    fork()时,子进程继承了父进程的进程组ID,所以父子进程默认属于同一个进程组,又因为同一个进程组的进程可以接受来自同一终端的各种信号所以当希望用键盘发送信号(如按下Ctrl+C)时,父子进程对接收 ...

最新文章

  1. MySQL自带工具使用介绍
  2. [转]孙鑫VC教程例子代码1---Windows程序内部运行原理
  3. Zip文件中文乱码问题解决方法(MAC->Windows)
  4. VS2019中配置opencv4.3.0(亲测有效)
  5. mysql复杂操作,.Net Core+mySqlSugar的一些稍复杂操作
  6. javase(Properties集合及学生对象信息录入文本中案例)
  7. 前端学习(1466):表格案例其他效果演示
  8. poi 读取excel
  9. html5中的 hr定位,被大家遗忘的 hr 标签元素
  10. ubuntu下adb连接android手机调试
  11. 如何监控电瓶车,根据交通规则推送给信息和罚单
  12. Windows 系统维护
  13. java8学习之双冒号用法
  14. java word 题目导入_java使用poi导入word题库
  15. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.4.0版)
  16. Redis教程(上课笔记)
  17. word参考文献交叉引用的多项引用,改逗号和破折号形式
  18. 《SEO的艺术(原书第2版)》——2.6 垂直搜索引擎
  19. 盛世乐居任命首席执行官及首席财务官
  20. 网络编辑招聘笔试题(答案)

热门文章

  1. Bailian4129 变换的迷宫【BFS】
  2. HDU2501 Tiling_easy version【递推+打表】
  3. scala 基础 —— 函数(柯里化)
  4. Java 接口(interface)的三种类型
  5. 矩阵分解(matrix factorization)
  6. TensorFlow 学习(十三)—— tf.app.flags
  7. PBS 作业调度应用
  8. 反复平方——快速计算一个数的平方
  9. linux系统批量杀掉进程命令,[Linux]使用awk批量杀进程的命令
  10. python序列类型包括哪三种映射类型_python序列类型包括哪三种