客户端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的更多相关文章

  1. 项目笔记---Socket Error Code翻译

    前言 在项目中为了方便调试及客户反馈,需要Socket错误数字的中文解释,MSDN上只有英文版,同时也想自己学习而且方便将来更新ErrorCode的实际发生的情景,顾有此博文. MSDN:https: ...

  2. 【招聘App】—— React/Nodejs/MongoDB全栈项目:socket.io&聊天实现

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  3. 使用uWSGI部署django项目

    先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...

  4. 在线白板,基于socket.io的多人在线协作工具

    首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...

  5. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  6. 使用uWSGI+nginx部署Django项目

    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...

  7. Linux C编程一站式学习读书笔记——socket编程

    前言 研一的时候写过socket网络编程,研二这一年已经在用php写api都快把之前的基础知识忘干净了,这里回顾一下,主要也是项目里用到了,最近博客好杂乱啊,不过确实是到了关键时刻,各种复习加巩固准备 ...

  8. 通过线程监控socket服务器是否done机

    现实中的socket可能会因为各种原因done机,但这么重要的服务器怎么能允许这种事情发生?这次我们就来通过一个线程去监控socket服务器,如果done机重新将其启动. 下面是监控项目和socket ...

  9. Loadrunner的Socket脚本关联小技巧

    Socket脚本关联小技巧 我们在socket脚本调试的时候经常会遇到很多问题,比如:socket包中繁杂的二进制编码,socket数据如何进行截取,如何对socket数据包进行参数化等等,以下几点内 ...

随机推荐

  1. queue模块

    queue队列 :使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when informa ...

  2. 洛谷 P1053 篝火晚会

    https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...

  3. 2个rman自动恢复的脚本

    ### scripts 1--the scirpt is used for restore db from vcs to a point to time recovery--and the targe ...

  4. Django的filter查询

    Django的filter查询 name__contains表示精确大小写的模糊查询 使用name__icontains表示忽略大小写 year_count = DownloadFile.object ...

  5. React Native开发时devices offline和手机不能晃动的处理

    1. adb device 显示 devices offline 可能重启adb server: $ adb kill-server $ adb start-server 2. 华为等手机不能 晃动显 ...

  6. leetcode287 Find the Duplicate Number

    思路: 转换成链表之后使用floyed判环法.转换之后重复的那个数字是唯一一个有多个前驱和一个后继的节点,因此是环的起始节点. 实现: class Solution { public: int fin ...

  7. CF1066B Heaters

    思路: 从左向右贪心选择能覆盖当前位置的最靠右的那个heater即可,和poj radar installation类似. 实现: #include <iostream> #include ...

  8. JavaScript之执行环境及作用域

        执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.我们编写的代码是无法访问这个对象的,但解 ...

  9. Eclipse-运行符-数据类型转换-环境变量配置

    1.能够使用Eclipse快捷键 ctrl + /   单行注释:再按一次则取消: ctrl + shift + /  多行注释:  ctrl + shift + \  取消多行注释: ctrl + ...

  10. js获取元素的页面坐标

    一.DOM中各种宽度.高度 二.DOM中的坐标系 JS获取div元素的宽度 offsetWidth=width+padding-left+padding-right+border-left+borde ...