1. django-websocket 是旧版本的,现在已经没有人维护了。dwebsocket是新版的,推荐使用dwebsocket;
整个demo:
1.项目结构:
2.HelloWorld项目代码:
urls.py代码:
from django.conf.urls import url
from django.contrib import admin
import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/(?P\w+)', views.gotoIndex),
url(r'websocketLink/(?P\w+)', views.websocketLink)# webSocket 链接
]
views.py
# coding=utf8
from django.shortcuts import render
import threading
from models import Ad
from dwebsocket.decorators import accept_websocket
import json
# from model_admin.models import MessageLog
# 跳转到主页
def gotoIndex(request, username):
return render(request, 'index.html', {'username': username})
# 存储连接websocket的用户
clients = {}
# 记录连接人数 其实没什么卵用 = =
count = 0
# 连接websocket ws://localhost:8000/websocketLink/22
# 因为 websocket 是协议 所以不能用 http或https
@accept_websocket
def websocketLink(request, username):
'连接websocket'
global count
# 获取连接
if request.is_websocket:
lock = threading.RLock()#rlock线程锁
try:
lock.acquire()#抢占资源
s = {}
# 因为同一个账号打开多个页面连接信息是不同的
if clients.get(username) != None:
# 连接信息 键 连接名 值:连接保存
s[str(request.websocket)] = request.websocket
# 已存在的连接信息继续增加
clients[username].update(s)
else:
# 人数加1
count = count + 1
# 连接信息 键 连接名 值:连接保存
s[str(request.websocket)] = request.websocket
# 新增 用户 连接信息
clients[username] = s
print("用户人数" + str(count))
# 监听接收客户端发送的消息 或者 客户端断开连接
# print type(unicode(message, "utf-8"))
# request.websocket.send(u"测试")
# request.websocket.send(unicode(message, "utf-8"))
sql = ("select id,code,name "
"from "
"prov_ad order by create_date desc limit 1"
)
data_list = Ad.objects.raw(sql)
datas = []
for item in data_list:
datas.append({
'id': item.id,
'name': item.name, # 区域名称
'code': item.code, # 区域编码
'long': item.long, # 经度
'lat': item.lat # 纬度
})
send(username,datas)
except Exception as e:
print e
finally:
# 通过用户名找到 连接信息 再通过 连接信息 k 找到 v (k就是连接信息)
clients.get(username).pop(str(request.websocket))
#释放锁
lock.release()
# 发送消息
def websocketMsg(client, msg):
import json
# 因为一个账号会有多个页面打开 所以连接信息需要遍历
for cli in client:
'client客户端 ,msg消息'
b1 = json.dumps(msg).encode('utf-8')
client[cli].send(b1)
# 服务端发送消息
def send(username, data):
'username:用户名 data:消息内容'
try:
if clients[username]:
websocketMsg(clients[username], { 'data': data})
except BaseException:
pass
finally:
pass
# messageLog.save()
index.html代码:
{% load static %}
django-websocket
如果项目部署到nginx服务上,你的项目要用到dwebsocket服务
一.先部署项目到Nginx:
1.xshell进入对应的目录:新建一个新的文件夹 例如:mkdir phots 在当前目录中建立名为photos的目录
2.svn 检出对应的项目文件 svn checkout svn://项目路径
3.查看对应项目是否包含nginx.conf和uwsgi.ini文件
如果有,修改里面对应的端口和配置目录,没有就先拷贝或新建
.conf文件里面修改Nginx的端口,uwsgi对应端口和文件所在目录
uwsgi.ini文件修改uwsgi对应的端口的目录,uwsgi和nginx对应的端口号是不同的
重新启动Nginx 和uwsgi文件,就可以启动项目服务
二.如果项目包含dwebsocket服务,还要再启动一个dwebsocket服务,才能让ws://服务器ip:8080进行通信
1.在项目对应的setting里添加下面配置WEBSOCKET_FACTORY_CLASS="dwebsocket.backends.uwsgi.factory.uWsgiWebSocketFactory"
2.重新复制一个uwsgi文件,重新命名,配置如下:重新命名为helloworld_uwsgi_8080
[uwsgi]
# uwsgi 使用配置文件启动
http = :8080
# 项目目录
chdir = xshell上的项目路径
# 指定项目的application
module =项目名称.wsgi
# 指定sock的文件路径
socket =xshell上的项目路径/uwsgi_8080.sock
# 启动uwsgi的用户名和用户组
uid = root
gid = root
# 进程数
workers = 1
# 接受的最大请求数
max-requests = 1000
pidfile=xshell上的项目路径/uwsgi_8080.pid
# 启动主进程
master=true
# 自动移除 unix socket和pid 文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启动线程
enable-threads=true
# 设置自中断时间
harakiri=100
# 设置缓冲
post-buffering=65535
# 不设置会导致上传大文件失败
buffer-size=65535
# 设置日志目录
daemonize= /mnt/logs/项目名称/uwsgi_8080.log
DJANGO_SETTINGS_MODULE=项目名称.settings
#这一句也是主要要加的参数
~
启动新加的这个uwsgi文件
3.项目里添加的dwebsocket服务就开启了
运行效果入下: