套接字

上海 day28--套接字socket

本小妞迷上赌 提交于 2019-11-26 17:44:16
目 录 socket套接字简介 socket基础编程     socket通信循环、socket连接循环、 半连接池 socket编程推导及存在问题      subprocess模块 、 struct模块 、 黏包问题 作业:大文件上传 一、socket套接字简介 什么是套接字? Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 socket的作用是什么? socket主要用于进程间的通信。 二、socket基础编程 1、socket 基础通信 import socket server = socket.socket() # 买手机 不传参数默认用的就是TCP协议 server.bind(('127.0.0.1',8080)) # bind((host,port)) 插电话卡 绑定ip和端口 server.listen(5) # 开机 半连接池 conn, addr = server.accept() # 接听电话 等着别人给你打电话 阻塞 data = conn.recv(1024) # 听别人说话 接收1024个字节数据 阻塞 print(data) conn.send(b'hello baby~') # 给别人回话 服务端 import socket client = socket.socket

TCP/UDP协议通信--Python高级

浪尽此生 提交于 2019-11-26 17:41:12
Python高级 基于UDP协议通信 特点:无连接(即不需要先建立连接),传输不可靠(丢包,乱序,但概率比较低,随着一些路由器等设备的提升,这种概率变得更低),尽力而为,通信过程和手机短信通信类似,但传输效率非常高(即通信速度很快), 使用UDP协议发送的数据包可能后发的数据包比先发的数据包先到,但概率比较低 通信实现步骤: 1.创建套接字(Socket):相当于买部手机,调用Socket,返回值是个对象 2.给套接字绑定地址:相当于给手机上号,即给自己准备的地址(IP和端口号),客户端程序可以省略这一步(采用隐式绑定) 3.通过套接字收发数据:相当于通过手机收发短信 4.关闭套接字,相当于关闭手机 基于TCP协议通信 特点:面向连接,传输可靠(差错校验,重传,拥塞控制,失序处理),通信过程和用手机打电话类似,但传输效率低(即通信速度慢), 为什么可靠:有校验数据的功能(即差错校验),校验时如果与你发过来的不一样,会要求你重传,拥塞控制,失序处理,当数据包进行切割,当后面的数据包先到时会让其在缓冲区等待,等前面的数据包都到达了再一起交给进程 TCP的客户端和服务器是不对等的 TCP服务器(相当于接电话的人)的实现步骤: 1.创建(监听)套接字,相当于买部手机 2.给套接字绑定地址,相当于给手机上号 3.将套接字设置为监听状态,相当于把手机设置为待机状态 4.接受客户端连接请求

FTP和TCP、UDP

*爱你&永不变心* 提交于 2019-11-26 17:40:41
应用:TFTP客户端 1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: 简单 占用资源小 适合传递小文件 适合在局域网进行传递 端口号为69 基于UDP实现 2. TFTP下载过程 TFTP服务器默认 监听69号端口 当客户端发送“下载”请求(即读请求)时,需要向服务器的69端口发送 服务器若批准此请求,则使用一个新的、临时的 端口进行数据传输 当服务器找到需要现在的文件后,会立刻打开文件,把文件中的数据通过TFTP协议发送给客户端 如果文件的总大小较大(比如3M),那么服务器分多次发送,每次会从文件中读取512个字节的数据发送过来 因为发送的次数有可能会很多,所以为了让客户端对接收到的数据进行排序,所以在服务器发送那512个字节数据的时候,会多发2个字节的数据,用来存放序号,并且放在512个字节数据的前面,序号是从1开始的 因为需要从服务器上下载文件时,文件可能不存在,那么此时服务器就会发送一个错误的信息过来,为了区分服务发送的是文件内容还是错误的提示信息, 所以又用了2个字节 来表示这个数据包的功能(称为操作码),并且在序号的前面 操作码 功能 1 读请求,即下载 2 写请求,即上传 3 表示数据包,即DATA 4 确认码

SOCKET,TCP/UDP,HTTP,FTP

孤人 提交于 2019-11-26 17:40:24
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层: 网络层:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议 传输层:TCP协议与UDP协议 应用层:FTP、HTTP、TELNET、SMTP、DNS等协议 HTTP是应用层协议,其传输都是被包装成TCP协议传输。可以用SOCKET实现HTTP。 SOCKET是实现传输层协议的一种编程API,可以是TCP,也可以是UDP。 (二)Socket连接与HTTP连接区别 【Socket】 由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。 【Http】 HTTP协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。由于HTTP在每次请求结束后都会主动释放连接

Redis 学习笔记(篇八):事件

回眸只為那壹抹淺笑 提交于 2019-11-26 16:33:24
Redis 服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件: Redis 服务器通过套接字与客户端(或者其他 Redis 服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 时间事件: Redis 服务器中的一些操作(比如 servercron 函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。 文件事件 文件事件处理器使用 I/O 多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accpt)、读取(read)、写人(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。 虽然文件事件处理器以单线程方式运行,但通过使用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与 Redis 服务器中其他同样以单线程方式运行的模块进行对接,这保持了 Redis 内部单线程设计的简单性。 尽管多个文件事件可能会并发的出现,但 I/O 多路复用程序总是会讲所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序

网络编程之UDP套接字编程

血红的双手。 提交于 2019-11-26 16:09:30
1. 实验目的 掌握单用户客户端跟服务器的连接和数据交互及处理。 2. 实验要求 认真阅读和掌握本实验的相关知识点。 上机编写并运行本程序。 保存程序的运行结果,并结合程序进行分析。 3. 实验内容 实现一个基于UDP协议的服务器-客户端程序,要求完成以下功能。 客户端: 从命令行读入服务器的IP地址;循环从命令行读入字符串,传递给服务器,并接收、显示服务器返回的字符串和服务器的地址信息; 服务器端: 循环接收客户的字符串,显示客户发送的信息和客户的IP地址和端口号; 返回字符串给对应的客户; 4. 实验代码和结果 1. 实验代码 服务端代码: # include <stdio.h> # include <string.h> # include <stdlib.h> # include <unistd.h> # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> # define PORT 1234 # define MAXDATASIZE 100 int main ( void ) { int sockfd ; struct sockaddr_in server , client ; int sin_size , num ; char msg

网络编程之tcp套接字编程

坚强是说给别人听的谎言 提交于 2019-11-26 16:07:32
1. 实验目的 掌握单用户客户端跟服务器的连接和数据交互及处理。 2. 实验要求 认真阅读和掌握本实验的相关知识点。 上机编写并运行本程序。 保存程序的运行结果,并结合程序进行分析。 3. 实验内容 实现一个基于TCP协议的服务器-客户端程序,要求完成以下功能。 客户端: 从命令行读入服务器的IP地址;并连接到服务器; 循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序,如果用户输入的是quit,则关闭连接; 客户程序显示反转后的字符串; 服务器端: 循环接收客户的连接请求,并显示客户的IP地址和端口号; 接收客户传来的字符串,反转后传递给客户; 4. 实验代码和结果 1. 实验代码 服务端代码: # include <stdio.h> # include <string.h> # include <stdlib.h> # include <unistd.h> # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> # define PORT 1234 # define BACKLOG 1 # define MAXDATASIZE 100 int main ( void ) { int listenfd ,

linux 网络编程——基础知识

会有一股神秘感。 提交于 2019-11-26 14:57:27
1. 基本知识 (1)socket int socket(int domain, int type, int protocol);  domain:确定通信特征,如地址格式 AF(address family) 地址族 AF_INET IPv4因特网域 AF_INET6 IPv6因特网域 AF_UNIX UNIX域 AF_UNSPEC 未指定  type:限定套接字类型,主要设置运输层特征 SOCK_STREAM 有序,可靠,双向面向字节流 SOCK_SEQPACKET 长度固定,有序,面向连接,报文传输 SOCK_DGRAM 长度固定,无连接,不可靠报文 SOCK_RAM IP协议层的数据包接口,即不使用预定义运输层  protocol:通常为0,表示按照给定的域和套接字类型选择默认协议。 socket返回fd,使其能使用部分文件IO的api close dup dup2 poll select write read  套接字是双向的,可以禁止其输入/输出 int shutdown(int sockfd, int how) how: SHUT_RD SHUT_WR SHUT_RDWR   (2)字节序   网络传输途径的设备不同,字节序不同,为了让所有设备都能理解数据包的包头信息,需要统一成大端字节序,   被统一的内容是路由设备会读取的内容,即 目标地址,源地址,目标端口号

socket 套接字

扶醉桌前 提交于 2019-11-26 14:53:06
1: socket 以及 小内容补充    1. socket : 又称为套件字,在python中使用需要导入这个模块(import socket)   2. 本机回环地址: (127.0.0.1) 只能自己识别自己,其他人无法访问 2: 基于TCP协议的socket使用   由于TCP协议都是基于链接的,所以必须要先启用服务端,再启动客户端 服务端: import socket # 导入socket模块 sk = socket.socket() # 创建一个socket对象 sk.bind(('127.0.0.1',8080)) # 绑定ip和端口,注意: bind方法只接收一个参数,所以里面要将ip和port先到一个元组里面 sk.listen(5) # 开始监听 注意:listen方法后面跟的int类型,表示待连接的最大监听个数,不写默认最大 conn,addr = sk.accept() # 阻塞, accept接收一个元组,conn是一个链接,也就是建立起来一个TCP的全双工,addr是监听到客户端的地址 ret = conn.recv(1024) # 阻塞 ,接收客户端消息,接收1024个字节,可以改变,推荐为1024的倍数,不可超出当前可用内存 print(ret) # 打印客户端发来的信息 conn.send(b'hi') # 向客户端发送信息

套接字中的TCP协议

我的未来我决定 提交于 2019-11-26 14:38:29
socket(套接字) 本地回环地址 127.0.0.1 我们先来写一个简单地服务器和客户端 服务端 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import socket ​ server = socket.socket() # 就比如买了一个手机 server.bind(( "127.0.0.1" , 8080 )) # bind中绑定的是IP地址和端口号,注意是一个元组,就比如,将手机卡,插入了手机 server.listen( 5 ) # 半连接池,最大等待连接数为5个,就比如开机 conn,address = server.accept() # 接听电话等着别人给你打电话 ​ date = conn.recv( 1024 ) # 听别人说话,接收1023个字节数 print (date) conn.send(b "hello" ) # 给别人回话 ​ ​ conn.close() # 挂断电话 server.close() # 关机 客户端 ? 1 2 3 4 5 6 7 8 9 10 11 import socket ​ client = socket.socket() #拿电话 client.connect(( "127.0.0.1" , 8080 )) #绑定的是IP地址和端口号,也是一个元组 拨号 ​ client.send(b