关键词:
1.什么是socket?
TCP,可靠地,面向连接协议,有阻塞rect
udp,不可靠的,无线连接的服务 这里因为不需要阻塞,所以速度会很快,但安全性不高
2.关于客户端退出而服务器未退出的解决办法
1 import socket 2 sock=socket.socket() # TCP协议 3 IP_PORT=("127.0.0.1",8899) 4 sock.bind(IP_PORT) 5 sock.listen(5) 6 while 1: 7 conn,addr=sock.accept() 8 while 1: 9 try:#这里是因为如果当客户端完成登陆后,由于客户端的退出,而 10 #服务端只是刚刚退出第一层循环,还在等着接收客户端传来的信息,所以 11 #会报错 只需要加一个异常处理,如果客户端离开则不会等待客户传来信息 12 #会处于待命状态,等待下一次传入 13 data=conn.recv(1024).decode("utf8") 14 print("接收信息:",data) 15 print("接收信息:",type(data)) 16 print("-----",data.split("|")) 17 user,pwd=data.strip().split("|") 18 # 文件操作 19 flag=False 20 with open("account","r") as f: 21 22 for line in f: 23 print("===",line.strip().split(":")) 24 username,password=line.strip().split(":") 25 if username==user and password==pwd: 26 flag=True 27 break 28 if flag: 29 conn.send(b"success") 30 else: 31 conn.send(b"fail") 32 except Exception as e: 33 break
客户端
1 import socket 2 3 sock=socket.socket() # TCP 4 sock.connect(("127.0.0.1",8899)) 5 6 while 1: 7 user=input("用户名>>>>") 8 pwd=input("密码>>>>") 9 val=("%s|%s"%(user,pwd)).encode("utf8") 10 sock.send(val) 11 response=sock.recv(1024) 12 print(response.decode("utf8")) 13 if response.decode("utf8")=="success": 14 break 15 else: 16 print("用户名或者密码错误!") 17 continue
3.模拟ssh
1 import struct 2 3 #打包 4 res=struct.pack("i","")#这里可以放数字 5 6 print(res)#最终显示的是4个字节 7 print(len(res))#始终四个字节.长度为4 8 9 obj=struct.unpack("i",res)#用于解包,最后显示元祖,后面一逗号结尾 10 print(obj[0])#获取解包后的数字 11 #struct模块主要用于当发生粘包时.由于向客户端/服务端发送两个 12 #字节时,计算机无法判断前后位置,所以又来区分因为打包后固定长度为4 13 #所以取前四段 14 b‘xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb‘ 15 #就可以区分了 16 #当然也可以用时间(睡眠)来区分
1 import subprocess#可以使cmd之间的程序在python中显示 2 3 res=subprocess.Popen("dir",#进行命令 4 shell=True, 5 stderr=subprocess.PIPE,#终端错误输出stderr 6 stdout=subprocess.PIPE)# 终端输出stdout 7 8 print(res.stdout.read().decode("gbk"))##返回的字节所以用gbk 9 #可以实现将cmd中的命令显示在python
1 import socket 2 import subprocess 3 server = socket.socket() 4 server.bind((‘127.0.0.1‘,8008)) 5 server.listen(5) 6 while True: 7 print("server is working.....") 8 conn,addr = server.accept() 9 # 字节类型 10 while True: 11 # 针对window系统 12 try: 13 cmd = conn.recv(1024).decode("utf8") # 阻塞#客户端传入的命令需要解码显示成字符串的形式 14 15 if cmd == b‘exit‘: 16 break 17 # res=subprocess.Popen(cmd,#subprocess模块 18 # shell=True, 19 # stderr=subprocess.PIPE, 20 # stdout=subprocess.PIPE, 21 # ) 22 # print("stdout",res.stdout.read()) 23 # print("stderr",res.stderr.read().decode("gbk")) 24 out=res.stdout.read()#终端输出 显示的是使用命令的正确 25 err=res.stderr.read()#终端错误 显示的是不是系统命令的报错提示 26 27 print("out响应长度",len(out))#知道长度才可以使他们逐一实现 28 print("err响应长度",len(err)) 29 if err: 30 import struct 31 header_pack = struct.pack("i", len(err))#首先一定要给出长度,客户端才会跟据长度 32 #来显示 33 conn.send(header_pack) 34 conn.send(err) 35 else:#没阻塞一次就发过去了 36 #构建报头 37 import struct#构建 38 header_pack=struct.pack("i",len(out))#数字的长度压缩完成报头 39 print("header_pack",header_pack) 40 # # 发送报头#将报文连在一起发送 41 conn.send(str(len(out)).encode("utf8"))#把数字转换成字符串,再转化成字节才可以发过去 42 # 发送数据 43 conn.send(out)#整体的数据 44 45 except Exception as e: 46 break 47 conn.close()
客户端
1 sk.connect((‘127.0.0.1‘,8008)) 2 3 while 1: 4 cmd = input("请输入命令:") 5 sk.send(cmd.encode(‘utf-8‘)) # 字节 6 if cmd=="": 7 continue 8 if cmd == ‘exit‘: 9 break 10 11 header_pack=sk.recv(4)#取前四个字节 12 data_length=struct.unpack("i",header_pack)[0]#解包 13 print("data_length",data_length) 14 ‘‘‘ 15 b‘xxx/xxx/xxx/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb‘ 16 17 18 ‘‘‘ 19 data_length=int(sk.recv(1024).de- code("utf8")) 20 print("data_length",data_length) 21 recv_data_length=0#判断是否小于接收到的字节 22 recv_data=b"" 23 while recv_data_length<data_length: 24 data=sk.recv(1024) 25 recv_data_length+=len(data)#接收多少就是这个 26 #实现的前提需要总长度, 27 recv_data+=data 28 print(recv_data.decode("gbk")) 29 sk.close()
3.关于粘包
粘包:发送长度和数据但是计算机不知道怎么去区分 两个send计算机不知道怎么区分
我们丢的东西没有丢
1.间隔短 2.文件不大3.
sleep 不让粘包
关于加密
1 import hashlib 2 3 # md5=hashlib.md5() 4 # md5.update(b"hello")#当分别输入hello 和 yaun时 结果与helloyuan 5 #一样,但是这样的好处是可以分开存储节省内存,要是一次写入那么多 6 #会疯的 7 # md5.update(b"yuan") 8 # 9 # print(md5.hexdigest()) 10 # print(len(md5.hexdigest())) 11 12 #helloyuan: d843cc930aa76f7799bba1780f578439 13 # d843cc930aa76f7799bba1780f578439 14 15 ############################################# 16 md5=hashlib.md5() 17 18 with open("ssh_client.py","rb") as f: 19 for line in f: 20 md5.update(line) 21 22 print(md5.hexdigest()) # f.read() 16位字节
网络编程之粘包(代码片段)
一、什么是粘包须知:只有TCP有粘包现象,UDP永远不会粘包粘包不一定会发生TCP发生粘包的两种情况: 1.由于Nagle算法,将多次间隔小且数量小的数据,合并成一个数据块 2.数据量发送大,接受少首先需... 查看详情
第六章-网络编程-粘包(代码片段)
1.粘包:多个包多个命令的结果粘到一起了因为recv1024限制了导致的结果参考:http://www.cnblogs.com/linhaifeng/articles/6129246.html粘包底层原理分析:1.运行一个软件和哪几个硬件有关硬盘内存cpu2.启动程序:硬盘程序加载到内存启一个软... 查看详情
网络编程粘包问题(代码片段)
首先说为什么会粘包,在py2上运行时,服务器把两次发送的操作强制的合成一次发送给客户端,所以粘在一起了,因为python3的版本是可以的,但是有的时候python3也会出现粘包现象。 解决粘包的问题有两种方法: ... 查看详情
网络编程基础粘包现象(代码片段)
粘包tcp是流式传输,字节流,数据与数据之间是没有边界的流式传输优点:不限定长度可靠传输缺点:慢和一个人的通信连接conn会一直占用我们的通信资源udp协议,面向数据包的传输数据包优点快由于不需要建立连接,所以谁... 查看详情
网络编程基础之粘包现象(代码片段)
一、粘包现象原理分析 1、我们先来看几行代码,从现象来分析: 测试程序分为两部分,分别是服务端和客户端 服务端.py 1#!/usr/bin/envpython32#-*-coding:utf-8-*-3#writebycongcong456importsocket78server=socket.socket(family=sock... 查看详情
网络编程之粘包问题使用socketserver实现并发(代码片段)
一、粘包问题注意:粘包问题只有tcp协议并且udp协议永远不会粘包粘包问题的产生:简述:粘包问题的产生主要是由于tcp协议传输数据(其内置的nagle算法来进行的)会将数据较小的且发送时间较短的合并成一个包从发送端发送... 查看详情
网络编程——通信循环链接循环粘包问题(代码片段)
通信循环、链接循环、粘包问题一、通信循环服务端和客户端可以进行连续的信息交流fromsocketimport*ser_socket=socket(AF_INET,SOCK_STREAM)ser_socket.bind((‘127.0.0.1‘,8886))ser_socket.listen(5)conn,addr=ser_socket.accept()whileTrue:try:#抛出异常,若不抛 查看详情
java网络编程——粘包拆包出现的原因及解决方式(代码片段)
在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情
java网络编程——粘包拆包出现的原因及解决方式(代码片段)
在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情
使用newlife网络库管道模式解决数据粘包(代码片段)
...一个基本的Newlife网络服务端这边我们来讲一下如何解决粘包的问题在上一篇总我们注册了Newlife的管道处理器,我们来看看他是如何实现粘包处理的svr.Add<ReciveFilter>();//粘包处理管道首先看一下我们设备的上传数据协议 &n... 查看详情
socket编程(代码片段)
TCP下粘包问题两种情况下会发生粘包。1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)发送方:AB #其实放在缓存里没发送发送方:B #其实放在缓存里没发... 查看详情
网络编程(代码片段)
阅读目录一客户端/服务器架构二osi七层三socket层四socket是什么五套接字发展史及分类六套接字工作流程七基于TCP的套接字八基于UDP的套接字九粘包现象十什么是粘包十一解决粘包的low比处理方法十二峰哥解决粘包的方法十三认... 查看详情
网络编程之粘包(代码片段)
粘包:传输层协议有tcp和udp两种tcp:TransmissionControlProtocol传输控制协议,基于数据流,收发的消息不能为空,需要在客户端和服务端都添加空消息的处理机制tcp是可靠性协议,数据的收发都需要确认信息,这就降低了传输效率,... 查看详情
java网络编程——粘包拆包出现的原因及解决方式(代码片段)
在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情
java网络编程——粘包拆包出现的原因及解决方式(代码片段)
在基于TCP协议的网络编程中,不可避免地都会遇到粘包和拆包的问题。什么是粘包和拆包?先来看个例子,还是上篇文章《Java网络编程——NIO的阻塞IO模式、非阻塞IO模式、IO多路复用模式的使用》中“IO多路复用模式... 查看详情
粘包和拆包(代码片段)
写在前面粘包、拆包是Socket编程中最常遇见的一个问题,本文只对粘包、拆包现象及发生的原因做简要分析,具体如何解决粘包和拆包的问题,在后续文章中会详细介绍。什么是粘包、拆包TCP是个"流"协议,所谓流,就是没有界... 查看详情
粘包现象(代码片段)
udp协议是不存在粘包现象的,因为它文件的传输方式就是面向包的tcp协议是有可能出现粘包现象的,它存在粘包的情况有两种:a.连续发送小包,如果出现网络延迟现象的话,两次发送的消息会一次性被接收b.如果一次性发送的,文件过... 查看详情
tcp协议粘包问题详解(代码片段)
TCP协议粘包问题详解前言 在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。 基于TCP协议的socket... 查看详情