服务器端要先根据客户端要下载的文件进行判断是否存在,还要根据文件大小来进行传送,最后还要比对文件的md5值来判断传送的文件是否正确,通过判断剩余字节来解决粘包问题 服务器端 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import socket import os import hashlib server = socket.socket() server.bind(('127.0.0.1',8080)) server.list…
使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server = socket.socket()#监听接收端口元组(本地,端口),绑定要监听的端口server.bind(('localhost',6969))#最大监听数,允许多少人在排队server.listen(5)while True: #循环锁定访问客户端 print("等待执行指令") c…
本地回环地址:127.0.0.1 简易版服务端: import socket ​ server = socket.socket() # 就比如买了一个手机 server.bind(("127.0.0.1",8080)) # bind中绑定的是IP地址和端口号,注意是一个元组,就比如,将手机卡,插入了手机 server.listen(5) # 半连接池,最大等待连接数为5个,就比如开机 conn,address = server.accept() # 接听电话等着别人给你打电话 ​ da…
上一篇随笔:“socket 接收大数据”,在win系统上能够运行,并且解决了大数据量的数据传输出现的问题,但是运行在linux系统上就会出现如下图所示的情况: 就是服务端两次发送给客户端的数据(第一次发送是时准备发送数据的字节大小,第二次是数据内容)粘在一起了,这是socket中的粘包: 查看服务端代码就能知道发生粘包的原因: import socket,os server = socket.socket() server.bind(('localhost',2222)) server.list…
客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8000)) def get_filename(file_path): return os.path.basename(file_path) operate = ['upload','download'] for num, opt in enumerate(operate,1): print(num,…
客户端发送hello,如果服务端 recv(1) ,那只能接收到 h 这一个字符,然后再recv(1) 一下,可以再接收一个 e , 因为客户端发送的结果长,所以只能把其他的先缓存下来,下次recv的时候再去接收. 这就是粘包,即两次结果粘到一起了. 粘包发生的原因是 socket 缓冲区导致的,如图: ​ 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用户态copy到内核态,这样的操作是耗资源和时间的,频繁…
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数据的远程交互,该双向通道直到任意一方主动断开才会失效 TCP协议的"三次握手" 和 "四次挥手" 三次握手 建连接 ​ 1.客户端向服务端发送建立连接请求 ​ 2.服务端返回收到请求信息,同时向客户端发送连接请求 ​ 3.客户端接收到服务端发来的请求,返回连接成功给服务…
本节内容 1.概述 2.代码实现 一.概述 上一篇博客讲到的用MD5来校验还是用的之前解决粘包的方法,就是客户端发送一个请求,等待服务端的确认的这样的一个笨方法.下面我们用另外一种方法:就是客户端已经知道可接收多少数据了,既然客户端已经知道接收多少数据了,那么客户端在接收数据的时候,正好接收已经知道的数据,不就ok了吗?就是说我循环了正好是收到已经知道的那些数据.比如:我要发5M的数据,我正好收到5M的数据,然后就不往下再收了,因为它有可能跟MD5值黏在一块了,本来说是发5M文件,结果你发了5.…
一,发生粘包 服务器端 from socket import * phone=socket(AF_INET,SOCK_STREAM) #套接字 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 phone.listen(5) conn,client_addr=phone.accept() #等待tcp接受 # data1=conn.recv(10) # p…
目录 1. recv 工作原理 2.升级版解决粘包问题 3. 基于UDP协议的socket通信 1. recv 工作原理 1.能够接收来自socket缓冲区的字节数据: 2.当缓冲区没有数据可以读取时,recv会一直处于阻塞状态,知道缓冲区至少有一个字节数据可取,或者客户端关闭: 3.关闭远程端并读取所有数据后,再recv会返回字符串. 2.升级版解决粘包问题 应用层自定义协议FTP(文件传输协议). low版: 只能是有限的数据,将总数据长度固定成4个字节作为报头,再recv.当文件数据特别大…