热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

websocketserver

   想要理解socket首先熟悉一下tcp/ip协议族,tcp/ip(transmissioncontrolprotocol/internetprotocol)即传输控制协议/网间协议

    想要理解socket首先熟悉一下tcp/ip协议族,tcp/ip(transmission control protocol/internet protocol)即传输控制协议/网间协议、定义了主机如何连入因特网及数据如何再他们之间传输的标准

    把所有的tcp/ip协议归类到四个抽象层中

    应用层:tftp,http,snmp,ftp,smtp,dns.telnet等等

    传输层:tcp,udp

    网络层:ip,icmp,ospf,eigrp,igmp

    数据链路层:slip,cslip,ppp,mtu

     每一抽象层建立在第一层提供的服务上,并且为高一层提供服务,看起来大概是这个样子的

    应用层(应用层,表示层,会话层)        应用程序      应用程序       应用程序       应用程序

    传输层(传输层)                   tcp                              udp

    网络层(internet层)      icmp                 ip             igmp

    链路层(数据链路层)                arp         硬件接口    rarp

    物理传输介质(网络接口层)        以太网   令牌环     帧中    atm

    在tcp/ip协议中两个因特网主机通过两个路由器和对应的层链接,各主机上的应用通过一些数据通道相互执行读取操作

    socket

    我们知道两个进程如果需要进行通讯最基本的一个前提能够唯一的表示一个进程,在本地进程中我们可以使用pid来唯一标示一个进程,但pid只有在本地唯一,网络中的两个pid冲突几率很大,这时候我们需要其他方法了,我们知道ip层的ip地址可以唯一表示主机,而tcp层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

    能够唯一标示网路中的进程后,我们就可以socket进行通信了,什么是socket?我们经常把socket翻译成套接字,socket是在应用层与传输层之间的一个抽象层,他们tcp/ip层复杂的操作抽象为几个简单的就共应用层调用已实现进程在网络中的通信

    socket起源于unix,在unix一切皆文件哲学的思想下,socket是一种“打开-读/写-关闭”的模式是实现的,服务器与客户端各自维护一个“文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

    socket通讯流程

    socket时“打开-读/写-关闭”模式的是实现,以使用tcp协议通讯的socket为例,其交互流程大概这样子

    服务器端:

    1.创建socket:socket()

    2.绑定socket和端口号:bind()

    3.监听该端口号:listen()

    4.接受来自客户端的连接请求:accept()

    5.从socket中读取字符:recv()

    6.关闭socket:close();

    客户端:

    1.创建socket:socket()

    2.连接指定的计算机端口:connect();

    3.向socket中写入信息:send()

    4.关闭socket:colse();

    概述:

    服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket

    服务器为socket绑定ip地址和端口号

    服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开

    客户端创建socket

    客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket

    服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求

    客户端连接成功,向服务器发送连接状态信息    

    服务器accept方法返回,连接成功

    客户端向socket写入信息

    服务器读取信息

    客户端关闭

    服务器端关闭


    tcp三次握手

    在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接


    

 socket编程API

前面提到socket是"打开—读/写—关闭"模式的实现,简单了解一下socket提供了哪些API供应用程序使用,还是以TCP协议为例,看看Unix下的socket

API,其它语言都很类似(PHP甚至名字都几乎一样),这里我就简单解释一下方法作用和参数,具体使用有兴趣同学可以看看博客参考中的链接或者上网搜索

int socket(int domain, int type, int protocol);

根据指定的地址族、数据类型和协议来分配一个socket的描述字及其所用的资源。

domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址

type:socket类型,常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等

protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

把一个地址族中的特定地址赋给socket

sockfd:socket描述字,也就是socket引用

addr:要绑定给sockfd的协议地址

addrlen:地址的长度

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

int listen(int sockfd, int backlog);

监听socket

sockfd:要监听的socket描述字

backlog:相应socket可以排队的最大连接个数 

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

连接某个socket

sockfd:客户端的socket描述字

addr:服务器的socket地址

addrlen:socket地址的长度

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 TCP服务器监听到客户端请求之后,调用accept()函数取接收请求

sockfd:服务器的socket描述字

addr:客户端的socket地址

addrlen:socket地址的长度

ssize_t read(int fd, void *buf, size_t count);

读取socket内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

ssize_t write(int fd, const void *buf, size_t count);

向socket写入内容,其实就是发送内容

fd:socket描述字

buf:缓冲区

count:缓冲区长度

int close(int fd);

socket标记为以关闭 ,使相应socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。

    



推荐阅读
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • MITM(中间人攻击)原理及防范初探(二)
    上一篇文章MITM(中间人攻击)原理及防范初探(一)给大家介绍了利用ettercap进行arp欺骗及劫持明文口令,后来我发现好友rootoorotor的文章介绍比我写的更透彻,所以基础利用大家可以参看 ... [详细]
  • 本文探讨了如何利用RxJS库在AngularJS应用中实现对用户单击和拖动操作的精确区分,特别是在调整区域大小的场景下。 ... [详细]
  • 在测试软件或进行系统维护时,有时会遇到电脑蓝屏的情况,即便使用了沙盒环境也无法完全避免。本文将详细介绍常见的蓝屏错误代码及其解决方案,帮助用户快速定位并解决问题。 ... [详细]
  • 本文详细介绍了如何在CentOS 6.5系统上安装和配置Redis 3.0.6,包括必要的环境准备、软件包下载、编译安装及基本功能测试。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • Nginx 启动命令及 Systemctl 配置详解
    本文详细介绍了在未配置和已配置 Systemctl 的情况下启动 Nginx 的方法,并提供了详细的配置步骤和命令示例。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
author-avatar
amy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有