socket也叫套接字,是对各种协议的封装,实现收发数据。 Python里socket工作过程:(图片来自网络) ? socket在Python中实际上是一个模块,实现发送和接收数据的功能。...,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP...s.recv(bufsize[,flag])服务和客户端接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。...其中data是包含接收数据的字符串,address是发送数据的套接字地址。s.sendto(string[,flag],address)发送UDP数据。...有时候服务器运行程序时间长,没有到接收语句,而客户端发送数据太快,导致出错 在客户端加个sleep... logging使用filehandler中文乱码 创建filehandler时,写入encode
AOF文件或者Lua脚本,而不是网络,所以这种客户端不需要套接字连接,自然也不需要记录套接字描 述符。...目前Redis服务器会在两个地方用到伪客户端,一个用于载入AOF文件并还原数据库状 态,而另一个则用于执行Lua脚本中包含的Redis命令 普通客户端的fd属性的值为大于-1的整数:普通客户端使用套接字来与服务器进行通...因为合法的套接字描述符不能 是-1,所以普通客户端的套接字描述符的值必然是大于-1的整数 执行CLIENT list命令可以列出目前所有连接到服务器的普通客户端,命令输出中的fd域显示了服务器连接客户端所使用的套接字描述符...比如一个非常长的字符串值,一个 由很多项组成的列表,一个包含了很多元素的集合等等 固定大小缓冲区 客户端的固定大小缓冲区由buf和bufpos两个属性组成: buf属性是一个大小为REDIS_REPLY_CHUNK_BYTES...list *reply; // ... } redisClient; 通过使用链表来连接多个字符串对象,服务器可以为客户端保存一个非常长的命令回 复,而不必受到固定大小缓冲区16KB大小的限制
,执行相应的业务处理 服务端返回响应:发送业务处理结果 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果) Socket套接字 网络编程中的核心就是Socket(套接字) API...DatagramSocket 构造方法: 方法签名 方法说明 DatagramSocket() 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端) DatagramSocket...(DatagramPacketp) 从此套接字发送数据报包(不会阻塞等待,直接发送) void close() 关闭此数据报套接字 注意:receive(DatagramPacket p)此处传入的相当于是一个空的对象...; //服务器不是只给一个客户端提供服务,而是需要给多个客户端提供服务,所以需要写一个循环 while(true){ //只要有客户端过来,就可以提供服务...相对来说建立连接,关闭连接也是要耗时 的,长连接效率更高。 主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送 请求,也可以是服务端主动发。
可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。...,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。...而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求 1.2.3 socket()函数 对于C/C++,socket函数一般在WinSock2.h和WinSock.h库中,开发者可通过在头文件中声明...s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv() 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量...其中data是包含接收数据的字符串,address是发送数据的套接字地址。
各个IO模型的比较如下图所示: Redis中的应用 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件:Redis服务端通过套接字与客户端(或其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象...命令请求处理器 networking.c/readQueryFromClient函数是Redis的命令请求处理器,这个处理器负责从套接字中读入客户端发送的命令请求内容,具体实现为unistd.h/read...当一个客户端通过连接应答处理器成功连接到服务器之后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求的时候,套接字就会产生AE_READABLE事件...当命令回复发送完毕之后,服务器就会解除命令回复处理器与客户端套接字的AE_WRITABLE事件之间的关联。...实际上错误类型很像RESP简单字符串类型,但是第一个字符是“-”。简单字符串类型和错误类型的区别是客户端把错误类型当成一个异常,错误类型包含的字符串是异常信息。
---- 文章目录 打开一个网络接口:套接字 绑定IP与端口:bind 监听网络来信:监听套接字 接收网络来访者:允许连接 客户端方面:申请连接 关闭通信套接字:close() 公共用途的套接字函数...返回值:返回一个通信套接字,为本机向网络通信的接口。...我们将用这个 socket 对象和客户端进行通信。 ---- 客户端方面:申请连接 connect((HOST, PORT)) 参数不用我再释义了吧。返回一个通信套接字。...connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。 ---- 关闭通信套接字:close() 用于关闭对某一个套接字的函数。...其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。
服务器与客户端不能直接发送列表,元素,字典等带有数据类型的格式,发送的内容必须是字符串数据。...,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息,通常可以忽略 s.send(string[, flag]) 发送TCP数据,将字符串中的数据发送到链接的套接字...,返回值是要发送的字节数量,该数量可能小于string的字节大小 s.sendall(string[, flag]) 完整发送TCP数据,将字符串中的数据发送到链接的套接字,但在返回之前尝试发送所有数据...其中data是包含接受数据的字符串,address是发送数据的套接字地址 s.sendto(string[, flag], address) 发送UDP数据,将数据发送到套接字,address形式为tuple...(ipaddr, port),指定远程地址发送,返回值是发送的字节数 s.close() 关闭套接字 s.getpeername() 返回套接字的远程地址,返回值通常是一个tuple(ipaddr, port
buffer,0,sizeof(buffer)); //清空buffer strcpy(buffer,"发送第一个报文"); if ((iret=send(sockfd,buffer,strlen(buffer...),0))<=0) //向服务器发送报文; { perror("send"); } else { printf("发送了一个%d字节的数据\n",iret); } //3.接收报文 char...要想给 sa_data 赋值,必须同时指明IP地址和端口号,例如”127.0.0.1:80“,遗憾的是,没有相关函数将这个字符串转换成需要的形式,也就很难给 sockaddr 类型的变量赋值,所以使用...\n"); } //4.接收客户端连接accept()函数 /*accept() 返回一个新的套接字来和客户端通信,addr 保存了客户端的IP地址和端口号, ,而 sock 是服务器端的套接字,大家注意区分...后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。
开发 TCP 客户端程序开发步骤回顾创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字2. socket 类的介绍导入 socket 模块 import socket创建客户端..., 注意: 字符串需要使用encode()方法进行编码接收数据‘recv’参数1: 表示每次接收数据的大小,单位是字节关闭套接字‘socket’表示通信完成TCP服务端程序开发学习目标能够写出TCP服务端应用程序接收和发送消息...开发 TCP 服务端程序开发步骤回顾创建服务端端套接字对象绑定端口号设置监听等待接受客户端的连接请求接收数据发送数据关闭套接字2. socket 类的介绍导入 socket 模块 import socket...当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。...认识TCP socket的发送和接收缓冲区当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存中的一片空间。
一单线程socket TCP套接字就是使用TCP协议提供的传输服务来实现网络通信的编程接口。...在Python中可以通过创建socket对象并指定type属性为SOCK\_STREAM来使用TCP套接字。...这里的端口并不是物理设备而是对IP地址的扩展,用于区分不同的服务,例如我们通常将HTTP服务跟80端口绑定,而MySQL数据库服务默认绑定在3306端口,这样当服务器收到用户请求时就可以根据端口号来确定到底用户请求的是...=SOCK_DGRAM - UDP套接字 # type=SOCK_RAW - 原始套接字 server = socket(family=AF_INET, type=SOCK_STREAM...下面使用多线程技术处理多个用户请求的服务器,该服务器会向连接到服务器的客户端发送一张图片。
伪客户端的请求命令不是来源于网络的,而是来源于 Lua 脚本或 AOF 文件(后续详细介绍)的,所以伪客户端不需要套接字连接,它也没有套接字描述符。...普通客户端采用相关套接字来实现与服务器的通信,因此服务器会利用 fd 属性来记录客户端套接字的描述符。...当 buf 数组已经存满或者回复因为太大而没有办法存入 buf 数组时,服务器就会使用可变大小的缓冲区。 链表 reply 和一个或多个字符串对象组成可变大小的输出缓冲区。...通过使用链表来连接多个字符串对象,服务器可以为客户端保存一个非常长的命令返回值,而不会受到大小的限制。如图所示为可变大小的输出缓冲区。...---- 客户端的 argv 和 argc 属性 argv 属性:这是一个数组,数组中的每个元素都是一个字符串对象,其中 argv[0]是要执行的命令,而之后的其他元素是传给这个命令的参数。
#第一个元素刚好就是一个套接字的设置部分,这就让c_socket也成为一个套接字对象,并且地址还是目标的 #第二个元素也是一个元组,包含P和端口,简单来说他会返回一个新的套接字...,经过调试后,发现是因为初始化套接字在经过连接后值会发生改变,而断开在重连他会带有一些原本的标识,而新的连接已经发生了改变,所以无法找到,于是陷入死循环,一直无法连接,于是就把初始化套接字放在大循环里,...连接成功部分是在小循环进行的,如果断开后,就重新初始化套接字,再次连接目标,这样来刷新断开后的套接字完成,只要客户端在运行,就可以连接到服务端 2、如果客户端被强制关闭将导致服务端报错退出,而不是继续等待新的连接...#第一个元素刚好就是一个套接字的设置部分,这就让c_socket也成为一个套接字对象,并且地址还是目标的 #第二个元素也是一个元组,包含IP和端口,将他们分别给不同的变量 c_socket...,所以需要编码发送 s_socket.send(STDOUT.encode()); #将正常读取的信息通过套接子发送给服务端,因为读取到的就是字节而不是字符串
报头中就会包含源IP和目的IP 源IP地址:发送数据报那个主机的IP地址,目的IP地址:想发送到的那个主机的IP地址 我们把数据从一台主机传递到另一台主机不是真正目的,真正通信的不是这两个机器,其实是这两台机器上面的软件...port标识服务器的唯一性不能做任何改变,要让客户端能找到服务器,就像110,120样不能被改变。而每次启动进程pid就会改变。...不用担心,未来网络发送的时候所有数据都是字符串;发送数据时使用的原生接口对于字符串信息自动转化 socket套接字接口 socket常见API // 创建 socket 文件描述符 (TCP/UDP,...常见的有三种: 1.网络套接字 2.原始套接字 3.unix域间套接字 我们主要了解第一个网络套接字 网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信。...而原始套接字可以跨过传输层(TCP/IP协议)访问底层的数据。这些套接字应用场景完全不同,所以我们想用就得用三套不同的接口。
数据报套接字:使用传输层UDP协议,对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节...对于一个服务端来说,重要的是提供多个客户端的请求处理及响应,流程如下: Java流套接字通信模型 UDP数据报套接字编程 DatagramSocket API DatagramSocket 是UDP...DatagramSocket 构造方法: 方法签名 方法说明 DatagramSocket () 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端) DatagramSocket...相对来说建立连接,关闭连接也是要耗时的,长连接效率更高。 主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送请求,也可以是服务端主动发。...client.close(); } } 运行结果: 客户端向服务端发送数据后就会重新断开连接,而服务端不会断开会等待下一个客户端的连接。
在内的大多数流行平台上都是用术语“地址家族”及其缩写“AF”而老一点的系统中,地址家族被称为“域”或“协议家族”,并使用缩写“PF”而不是“AF” 由于两个进程都运行在同一台机器上,而且这些套接字是基于文件的...,一般格式为元祖(host,port)的格式,如果出错,返回socket.error错误 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数...其中data是包含接收数据的字符串,address是发送数据的套接字地址。...s.makefile() 创建一个与该套接字相关连的文件 三 简单实例 注意: 必须先启动服务器端,因为服务器端创造接口和IP地址以供客户端访问 1 只能输入一次的基础配置 1 服务器端配置...4 如果参数错误,则返回错误的名称,而不会报错或者直接终止链接: 1 服务端配置 ? 2 客户端匹配 ? 3 测试 ?
A主机,西天的大雷音寺是B主机,唐僧并不是到大类饮食就完了,这只是他的手段, 他还需要面见如来,如来会提供给他经书的服务 ---- 数据发起时,从主机A的传输层开始,交给主机B的传输层 而数据是从主机...sockaddr_in 预间套接字 (使用在两个进程间使用本地进程通信的) sockaddr_un 套接字的设计者为了能够让所有人以 一套接口的方式 既能本地通信 又能网络通信, 所以设计出一个公共的数据结构...若套接字创建成功,则返回文件描述符 文件描述符的前三个分别被 标准输入 标准输出 标准错误占用,所以此时的文件描述符应该打印出3 bind——绑定的使用 输入 man 2 bind ,查看绑定 给一个套接字绑定一个名字...ip_ 由于我们设置的IP地址是字符串风格的,而系统中的IP地址是4字节风格的 所以就需要将字符串风格的转化为 4字节风格的 inet_addr ——字符串风格转化为4字节风格 输入 man inet_addr...——将4字节风格转为字符串风格 输入 man inet_addr,将4字节IP转为字符串风格的IP ---- peer下的端口号为网络序列,想要获取客户端的端口号 clientport,需要使用
socket.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来 客户端套接字...socket.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数...其中data是包含接收数据的字符串,address是发送数据的套接字地址。...socket.makefile() 创建一个与该套接字相关连的文件 套接字对象方法,除了 makefile...我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。
; 套接字描述符 客户端状态的fd属性记录了客户端正在使用的套接字描述符: typedef struct redisClient { // ......AOF文件或者Lua脚本,而不是网络,所以这种客户端不需要套接字连接,自然也不需要记录套接字描述符。...普通客户端的fd属性的值为大于-1的整数:普通客户端使用套接字来与服务器进行通信,所以服务器会用fd属性来记录客户端套接字的描述符。...可变大小的缓冲区用于保存那些长度比较大的回复,比如一个非常长的字符串值,一个由很多项组成的列表,一个包含了很多元素的集合等等。...list *reply; // ... } redisClient; 通过使用链表来连接多个字符串对象,服务器可以为客户端保存一个非常长的命令回复,而不必受到固定大小缓冲区16KB大小的限制。
通过打包的方式,将结构体message发送给对方 对方收到后就会报告给上层QQ客户端 结构化的数据 是由 多个 string 构成的 而以前在网络套接字 发送时,都是按照一个字符串的方式来发送和接收的...序列化 与 反序列化 所以想办法 ,把多个字符串 转化为 一个大"字符串",对方在接收时也是一个长的字符串, 再想办法把这个字符串转回结构化的数据,就可以让上层使用 把一个结构化的数据 转化为 一个长的字符串...的 过程 称之为 序列化 把一个长的字符串 转化为 一个结构化的数据的 过程 称之为 反序列化 2....Tcp 套接字的封装——sock.hpp Sock.hpp 表示 对Tcp套接字的封装 设置一个私有变量 监听套接字 (与accept返回的文件描述符 进行区分) 创建套接字——Socket 输入 man...发送 输入 man send 第一个参数为 套接字 第二个参数为特定字符串数据 第三个参数为 数据长度 第四个参数为 默认为0 3.
领取专属 10元无门槛券
手把手带您无忧上云