项目之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数据包进行参数化等等,以下几点内 ...
随机推荐
- mongodb数据库分片实现链接
http://www.lanceyan.com/tech/arch/mongodb_shard1.html
- Codeforces Round #396 (Div. 2) D
Mahmoud wants to write a new dictionary that contains n words and relations between them. There are ...
- 2019/05/11 JAVA虚拟机原理
所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmare就属于系统虚拟机,他们完全是对物理计 ...
- 深入浅出Android动态加载jar包技术
在实际项目中,由于某些业务频繁变更而导致频繁升级客户端的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路,将核心的易于变更的业务封装在jar包里然后通过网络下载下来,再由 ...
- bufferedinputStream操作
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...
- ThreadLocal使用,应用场景,源码实现,内存泄漏
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各 ...
- COGS 788. 昵称
788. 昵称 ★☆ 输入文件:nickname.in 输出文件:nickname.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] ZSUQ送信者与腾讯QQ相似 ...
- HDU 4348 I - To the moon 可持续化
队友套的可持续化线段树,徘徊在RE和MLE之间多发过的... 复用结点新的线段树平均要log2N个结点. 其实离线就好,按照时间顺序组织操作然后dfs. #include <iostream&g ...
- iOS的设计备忘录/资源集合(新手快速开发)
iOS的设计备忘录 随着iOS7更新,风格走上扁平化,大部分iOS设计师及程序员都需要对自己的软件做相关调整,尺寸.Icon.UI等等,我在这里总结一下相关资料,以及提供一些关于iOS7设计素材. 一 ...
- jni ndk 入门
1. Linux环境模拟,下载sygwin 安装,选择devl 和shell -> install sygwin 中的配置ndk环境,进入安装目录c:/cygwin64 etc/profile文 ...