项目之socket
客户端socket
客户端套接字完成的任务很统一,发送请求,接收请求结果
可以封装成一个方法
使用的tcp协议存在粘包问题,故需要自定义报头
import json
import struct
#项目需要使用到时间,json无法序列化时间对象
#以下操作使json将时间对象序列化
class Myjson(json.JSONEncoder):
def default(self, field):
if isinstance(field, datetime):
return field.strftime("%Y-%m-%d %X")
return json.JSONEncoder.default(self, field)
def send_data(c, dic):
json_data = json.dumps(dic, cls=Myjson).encode("utf-8")
len_data = struct.pack("i", len(json_data))
c.send(len_data)
c.send(json_data)
def recv_data(c):
struct_len = c.recv(4)
data_len = struct.unpack("i", struct_len)[0]
json_data = c.recv(data_len).decode("utf-8")
dic = json.loads(json_data)
return dic
from socket import socket
from conf.settings import CLIENT_CONF
from lib.common import recv_data,send_data
c = socket()
c.connect((CLIENT_CONF["host"],CLIENT_CONF["port"]))
#client 工作
def client_run(req_dic):
send_data(c,req_dic)
res_dic = recv_data(c)
return res_dic
服务端socket
与客户端的区别,需要支持并发
使用多路复用达到并发目的
使用select模块帮我们检测可操作连接
recv操作是耗时的,从客户端操作系统缓存到服务端操作系统缓存,
而send操作默认从应用程序将消息发到缓存就算完成,故是很快的
故项目此处只检测可读连接,大型项目需检测可写连接,因为内存可能会满
import select
from core import user,admin
from socket import socket
from conf.settings import SERVER_CONF
from lib import common
s = socket()
s.bind((SERVER_CONF["host"],SERVER_CONF["port"]))
s.listen(5)
#完成任务的分发
def admin_interface(req_dic,c=0):
return admin.main(req_dic,c)
def user_interface(req_dic,c=0):
return user.main(req_dic,c)
func_dic={
1:admin_interface,
0:user_interface
}
asy_work = ["asy_upload_movie","asy_download_movie"]
def client_work(r):
req_dic = common.recv_data(r)
if not req_dic:return
if req_dic["user_type"] in func_dic:
if req_dic["opt"] in asy_work:
res_dic = func_dic[req_dic["user_type"]](req_dic,r)
else:
res_dic = func_dic[req_dic["user_type"]](req_dic)
else:
res_dic = {"status":"ng","msg":"user_type does not exist"}
if res_dic:
common.send_data(r,res_dic)
#select模块
rlist = [s,]
def server_run():
while True:
rl,_,_, = select.select(rlist,[],[])
for r in rl:
if r == s:
c,_ = s.accept()
rlist.append(c)
else:
try:
client_work(r)
except ConnectionResetError:
r.close()
rlist.remove(r)
项目之socket的更多相关文章
- 项目笔记---Socket Error Code翻译
前言 在项目中为了方便调试及客户反馈,需要Socket错误数字的中文解释,MSDN上只有英文版,同时也想自己学习而且方便将来更新ErrorCode的实际发生的情景,顾有此博文. MSDN:https: ...
- 【招聘App】—— React/Nodejs/MongoDB全栈项目:socket.io&聊天实现
前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...
- 使用uWSGI部署django项目
先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...
- 在线白板,基于socket.io的多人在线协作工具
首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- 使用uWSGI+nginx部署Django项目
最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...
- Linux C编程一站式学习读书笔记——socket编程
前言 研一的时候写过socket网络编程,研二这一年已经在用php写api都快把之前的基础知识忘干净了,这里回顾一下,主要也是项目里用到了,最近博客好杂乱啊,不过确实是到了关键时刻,各种复习加巩固准备 ...
- 通过线程监控socket服务器是否done机
现实中的socket可能会因为各种原因done机,但这么重要的服务器怎么能允许这种事情发生?这次我们就来通过一个线程去监控socket服务器,如果done机重新将其启动. 下面是监控项目和socket ...
- Loadrunner的Socket脚本关联小技巧
Socket脚本关联小技巧 我们在socket脚本调试的时候经常会遇到很多问题,比如:socket包中繁杂的二进制编码,socket数据如何进行截取,如何对socket数据包进行参数化等等,以下几点内 ...
随机推荐
- linux常用命令(ubuntu)
编辑: vi [path] vim [path] :q 退出 :wq 保存退出 查看进程 ps ps -aux | grep mem 查看全部含 “mem”的进程 ps –aux 查看全部 在系统启 ...
- (bzoj1337 || 洛谷P1742 最小圆覆盖 )|| (bzoj2823 || 洛谷P2533 [AHOI2012]信号塔)
bzoj1337 洛谷P1742 用随机增量法.讲解:https://blog.csdn.net/jokerwyt/article/details/79221345 设点集A的最小覆盖圆为g(A) 可 ...
- python入门之递归
表现形式: 函数体里包含执行本身 def f1(): r = f1() f1() 实例: 斐波那契数 (a1+a2=a3 a2+a3=a4 a3+a4=a5 ......) def f1( ...
- css水平垂直居中块整理
1.绝对定位+负margin 兼容性很好,但需要指定子块的高度和宽度,以及负margin .wp{ position: relative; width: 200px; height: 200px; b ...
- 在webconfig放置固定值
通常的,为了布置到服务器后修改的方便通常把一些会改变的值放在webconfig: 首先在web.ocnfig中放入如下值 <appSettings> <add key="A ...
- 起学习iOS开发专用词汇
今天的单词分别是: l Asynchronous 形容词 异步的 n 副词形式: asynchronously 异步地 n 缩写:ASYNC n 反义词:synchronous 形容词同步 ...
- The Django Book 第三章 试图和URL配置
之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...
- Cannot fetch index base URL https://pypi.python.org/pypi/ 解决方法
vi /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # ...
- 用Hexo免费搭建你自己的博客
Hexo基于node.js,可用于生成静态博客,结合github和Mac,可以专注创作了. 深入学习见文末引用. hexo安装 brew install node npm install hexo-c ...
- Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题
Fedora19 有关输入法的无法切换问题 和 终端的快捷设置问题 1.首先,要单击右上角的设置输入法的"区域与语言设置",要设置为“为每个窗口设置不同的输入源”. 还有,刚使用的 ...