项目之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数据包进行参数化等等,以下几点内 ...
随机推荐
- UWP 播放媒体控件
最近我的uwp需要有一个有声朗读的功能,like this 点击声音按钮就可以有声朗读了.这里主要是用了媒体播放的控件. 一般我们把需求分为两种: 一种是不需要呈现播放器的样子,只需要用户点击一下别的 ...
- Codeforces 1139F(树状数组+扫描线)
题目传送 做法 对于每个人,inc为x,pref为y:对于每道菜,p和s为x,b为y 于是根据题意有\[p[i]<=x<=s[i]\]\[p[i]+b[i]<=x+y\]\[p[i] ...
- Influxdb 时序数据库 centos 安装
Influxdb 环境搭建 操作系统:CentOS 7 X64 SSH工具:PuTTY 操作系统安装,请参照官网文档进行:https://www.centos.org/ 使用PuTTY 通过ssh连接 ...
- 关于@Mapper和@Repository的一点小理解
参考博客:https://blog.csdn.net/lalioCAT/article/details/51803461 如果在接口上@Mapper,然后再在 xml中的namespace指向mapp ...
- JS脚本不能执行
这段时间在做前端的动态页面,出了很多问题,因为js平时用的很少,所以花了不少无用功. 其中有两点一定要注意: 1.当js中有语法错误时,js脚本会无法执行. 2.当js脚本中有未定义的变量时,后边的语 ...
- [转]Cordova android框架详解
本文转自:http://www.cnblogs.com/hubcarl/p/4202784.html 一.Cordova 核心java类说明 CordovaActivity:Cordova Activ ...
- watir-webdriver使用过程中异常
1.在jruby版本1.6.7中,报异常:not such file to load --watir-webdriver 解决方法 :在文件的首行添加:require 'rubygems' ...
- 学习typescript(一)
环境 必装软件 node,推荐 node 8.0 npm,推荐 npm 5.0 git, 最新版 vscode, 编绎器 必装包 tsc: npm install -g typescript typi ...
- react-native入门学习( 一 )
开发环境配置 因为个人电脑是windows7环境,所以在选择安装react-native 环境的时候是用的 windows+androidreact-native中文网文档地址 https://re ...
- Java-IDEA环境搭建swagger
1.项目POM导入包(使用Maven管理的代码) 2.POM文件导入包 <dependencyManagement> <dependencies> <dependency ...