项目之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数据包进行参数化等等,以下几点内 ...
随机推荐
- 深度学习环境搭建(Ubuntu16.04+GTX1080Ti+CUDA8.0+Cudnn6.0+TensorFlow+Caffe2(Pytorch))
OS System:Ubuntu16.04 GPU Device:GTX1080Ti Softwares:CUDA8.0.Cudnn6.0.TensorFlow(1.4.0).Caffe2(1.0.0 ...
- Zynq7000开发系列-6(QT开发环境搭建:Ubuntu、Zynq)
操作系统:Ubuntu14.04.5 LTS 64bit Qt:Qt 5.4.2 (qt-opensource-linux-x64-5.4.2.run.qt-everywhere-opensource ...
- sQL存储过程的优缺点
目前具体的项目中没有使用sql存储过程,都用的封装好的框架,简单说下存储过程的优缺点. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编 ...
- C# 委托链、多路广播委托
委托链.多路广播委托:也就是把多个委托链接在一起,我们把链接了多个方法的委托称为委托链或多路广播委托 例: class HelloWorld { //定义委托类型 delegate void Dele ...
- Tinghua Data Mining 5
ID3 ID3算法倾向于分的很细的变量 C4.5加入分母为惩罚量
- dzzoffice 任意文件删除漏洞分析
dzzofiice 任意文件删除漏洞 \upload\dzz\system\dzzcp.php第199行 elseif($do=='deleteIco'){ $arr=array(); $ ...
- Java EE学习笔记(一)
spring入门程序: 1.导入Spring的4个基础包以及commons-logging的JAR包复制到lib目录中 2.src->com.itheima.ioc包下: ①UserDao.ja ...
- js实现对象或者数组深拷贝
今天遇到个问题,就是vue绑定的数组在push中所有的数组都会跟着改变.这个主要是因为 JavaScript中对象或者数组等引用类型,直接拷贝,改变一个另外一个也会改变: 有个简单的方法就是先转换为字 ...
- js js弹出框、对话框、提示框、弹窗总结
js弹出框.对话框.提示框.弹窗总结 一.JS的三种最常见的对话框 //====================== JS最常用三种弹出对话框 ======================== //弹 ...
- PostgreSQL 的日期函数用法举例
最近偶有开发同事咨询 PostgreSQL 日期函数,对日期处理不太熟悉,今天详细看了下手册的日期函数,整理如下,供参考. 一 取当前日期的函数 --取当前时间skytf=> select no ...