Python全栈开发:socket代码实例
客户端与服务端交互的基本流程
- 服务端server
#!/usr/bin/env python
# -*- coding;utf-8 -*-
import socket sk = socket.socket()
sk.bind(("127.0.0.1", 9999))
sk.listen(5)
while True:
conn, address = sk.accept()
conn.sendall(bytes("欢迎访问老男孩!",encoding="utf-8"))
while True:
ret_bytes = conn.recv(1024)
ret_str = str(ret_bytes, encoding="utf-8")
print(ret_str)
if ret_str == "q":
break
conn.sendall(bytes("答:" + "好!", encoding="utf-8")) - 客户端client
#!/usr/bin/env python
# -*- coding;utf-8 -*-
import socket obj = socket.socket()
obj.connect(("127.0.0.1", 9999))
ret_bytes = obj.recv(1024)
ret_str = str(ret_bytes, encoding="utf-8")
print(ret_str)
while True:
inp = input("请输入内容:\n 问:")
obj.sendall(bytes(inp, encoding="utf-8"))
if inp == 'q':
break
else:
ret = str(obj.recv(1024), encoding="utf-8")
print(ret)
obj.close()
粘包问题解决方案:一个类型文件发送完毕之后进行一次确认信息交互。
- server(粘包)
#!/usr/bin/env python
# -*- coding;utf-8 -*- import socket sk = socket.socket()
sk.bind(("192.168.1.107", 9999,)) # 传入元组
sk.listen(5) # 监听客户端请求,最多有五个客户端请求等待)
# 连接,客户端的地址信息(IP,port)
while True:
conn, address = sk.accept() # accept表示阻塞,等待连接请求
conn.sendall(bytes("欢迎访问老男孩!", encoding="utf-8"))
file_size = str(conn.recv(1024), encoding="utf-8")
print(file_size)
conn.sendall(bytes("开始吧!", encoding="utf-8"))
total_size = int(file_size)
has_recv = 0
with open("c11.py", "wb") as f:
i = 0
while True:
if total_size == has_recv:
print("接收完毕!")
break
data = conn.recv(1024)
f.write(data)
has_recv += len(data)
obj.close() - client(粘包)
#!/usr/bin/env python
# -*- coding;utf-8 -*-
import socket
import os obj = socket.socket()
obj.connect(("192.168.1.107", 9999))
result_bytes = obj.recv(1024) # 等待发送消息
result_str = str(result_bytes, encoding="utf-8")
print(result_str)
# 发送当前文件大小
file_size = os.stat("client(粘包).py").st_size
print("文件大小:" + str(file_size))
obj.sendall(bytes(str(file_size), encoding="utf-8"))
obj.recv(1024)
with open("client(粘包).py", "rb") as f:
seed_size = 0
for i, line in enumerate(f, 1):
obj.sendall(line)
seed_size += len(line)
if seed_size == file_size:
print("发送完毕!")
obj.close()
IO多路复用在socket中的运用:针对老用户和新用户,服务器做出不同的响应
- server服务端
#!/usr/bin/env python
# -*- coding;utf-8 -*-
"""
IO多路复用socket实例代码
"""
import socket
import select sk1 = socket.socket()
sk1.bind(("127.0.0.1", 8001))
sk1.listen(5)
inputs = [sk1, ]
info_sender = []
message = {} while True:
# select自动监听文件描述符,发生变化则放入r_list列表中
r_list, w_list, e_list = select.select(inputs, info_sender, [], 1)
# print("正在监听的对象数量:%d" % len(inputs))
for sk in r_list:
# sk 表示每个连接对象
if sk == sk1:
# 有新用户建立连接
conn, address = sk.accept()
conn.sendall(bytes("hello", encoding="utf-8"))
inputs.append(conn)
message[conn] = []
else:
# 有老用户发送信息
try:
date = str(sk.recv(1024), encoding="utf-8")
except Exception as e:
e_list.append(sk)
else:
if sk not in info_sender:
info_sender.append(sk)
message[sk].append(date) for sk in w_list:
re = message[sk][0]
del message[sk][0]
sk.sendall(bytes(re + "hello", encoding="utf-8"))
# 给我发送信息的对象,我回复了信息就要把它排除,不然前面有while循环,和for循环,就会不断给对方回复消息!
info_sender.remove(sk) for sk in e_list:
inputs.remove(sk) - 客户端client(client1,client2,client3):当用户第一次连接时执行相同的操作,支持多用户与服务器交互,客户端断开连接,服务器不受影响
#!/usr/bin/env python
# -*- coding;utf-8 -*-
import socket sk1 = socket.socket()
sk1.connect(("127.0.0.1", 8001))
while True:
content1 = str(sk1.recv(1024), encoding="utf-8")
a = []
print(content1)
while True:
inp = input(">>>")
if inp == "q":
a.append(inp)
break
else:
sk1.sendall(bytes(inp, encoding="utf-8"))
content2 = str(sk1.recv(1024), encoding="utf-8")
print(content2)
if a == ["q"]:
break
sk1.close()
Python全栈开发:socket代码实例的更多相关文章
- Python全栈开发:递归实例
#!/usr/bin/env python # -*- coding;utf-8 -*- """ 递归不能无限,python会限制递归深度,递归主要用于费布拉切数列 &q ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- 学习笔记之Python全栈开发/人工智能公开课_腾讯课堂
Python全栈开发/人工智能公开课_腾讯课堂 https://ke.qq.com/course/190378 https://github.com/haoran119/ke.qq.com.pytho ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
随机推荐
- NX二次开发-UFUN设置透明度UF_OBJ_set_translucency
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize( ...
- [JZOJ 100025] 棋盘
题意:求剩余面积. 首先吐槽题号:究竟\(JZOJ\)有多少未公开的题目... 思路: 简单的一批啊... 不知道为啥上午不过下午就过了?? 难道是海螺姑娘光顾我?? 多说了都是灵异故事... 其实就 ...
- git rm --cached (解决:modified: .idea/workspace.xml,git idea 操作完之后不能pull)
错误解决:modified: .idea/workspace.xml 这个错误是本地的.idea提交到了远端. 解决办法: .gitignore文件加上: .dea/workspace.xml 可是. ...
- linux 下 CDH4.5编译
1.安装JDK JDK:我这里 安装的是jdk1.6.0_23 1.1:给文件执行的权限chmod u+x jdk-6u23-linux-x64.bin 1.2: ./jdk-6u23-linux-x ...
- ps-使用通道抠图为XX换背景
第一步先载入图片 点击通道,复制蓝色通道 然后点击新的蓝色通道,图像-调整-曲线-改变输入输出, 然后用历史画笔全部填黑. 然后载入选区,复制.在图层中新建蒙版 黏贴,反向(CTRL+I)就可以了. ...
- this.$router.go()和this.$router.push()的差别
1.this.$router.go(val) => 在history记录中前进或者后退val步,当val为0时刷新当前页面. 2.this.$router.push(path) => 在h ...
- 2018湘潭大学程序设计竞赛【H】
题目链接:https://www.nowcoder.com/acm/contest/105/H 题意:两个操作,一个在[l,r]区间放颜色为c的球,一个统计在[l,r]里有多少不同颜色的球. 题解:哎 ...
- MySQL 07章_子查询
子查询就是查询中还可以嵌套其他的查询,通常是内层查询的结果作为外层查询的条件来使用 执行循序,自内向外依次执行 一.内层查询返回“单列单行”的结果 -- 1.查询宋江的出生日期 SELECT TIME ...
- python ORM框架:SqlAlchemy
ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程( ...
- cookie与token对比(转)
1.cookie(储存在用户本地终端上的数据( 为了辨别用户身份.进行 session 跟踪)) HTTP协议本身是无状态的,所以需要一个标志来对用户身份进行验证 用户登录成功后,会在服务器存一个se ...