下面的是server端:把IP改成自己的局域网IP:

  

#coding:utf8
import socket,select
import SocketServer
import hashlib,base64,time
from pprint import pprint #author:lijim
def f(key): s=key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
sha1=hashlib.sha1(s)
dig=sha1.digest()
return base64.encodestring(dig).strip() def parse_data(msg):
code_length = ord(msg[1]) & 127 if code_length == 126:
masks = msg[4:8]
data = msg[8:]
elif code_length == 127:
masks = msg[10:14]
data = msg[14:]
else:
masks = msg[2:6]
data = msg[6:] i = 0
raw_str = '' for d in data:
raw_str += chr(ord(d) ^ ord(masks[i%4]))
i += 1
return raw_str
def send_data(raw_str):
back_str = [] back_str.append('\x81')
data_length = len(raw_str) if data_length < 125:
back_str.append(chr(data_length))
else:
back_str.append(chr(126))
back_str.append(chr(data_length >> 8))
back_str.append(chr(data_length & 0xFF)) back_str = "".join(back_str) + raw_str
return back_str gmsg=None def m(cs,raddr):
print raddr
req= cs.recv(8*1024)
print 'request:\n',req
print '-'*20+'\n' tmplist=req.split("\r\n")
headers={}
get=tmplist.pop(0)
for i in tmplist:
if i.find(":") !=-1: item=i.split(":") headers[item[0]]=item[1].strip()
# pprint(headers)
key=headers.get("Sec-WebSocket-Key","")
print '-'*20
print 'key:',key
accept=f(key)
print '-'*20+'\n'
ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),) print 'response:\n'
print ends
cs.send(ends)
print '-'*20
global gmsg
while 1:
try:
r,w,e=select.select([cs,],[],[],0.5)
if gmsg:
cs.send(send_data(str(raddr)+':'+gmsg))
gmsg=None if cs in r:
msg=cs.recv(8*1024)
if msg:
data=parse_data(msg) if data!='close':
gmsg=data
print '%s:%s'%(raddr,data)
cs.send(send_data(str(raddr)+':'+data))
else: break except:
cs.close() ## cs.shutdown(2)
## cs.close()
## except KeyboardInterrupt:
### sock.shutdown(1)
## sock.close()
## print 'stop.'
## break sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) address=("192.168.1.104",8888)
sock.bind(address)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.listen(20) websocktemplate=''.join(["HTTP/1.1 101 Switching Protocols\r\n"
,"content-type:charset=utf-8\r\n"
,"Upgrade:websocket\r\n"
,"Connection: Upgrade\r\n"
,"Sec-WebSocket-Accept:%s\r\n"
,"WebSocket-Origin:%s\r\n"
,"WebSocket-Location: ws://%s/WebManagerSocket\r\n"
,"WebSocket-Protocol:WebManagerSocket\r\n\r\n"]) import threading
while 1:
r,w,e=select.select([sock,],[],[],1)
print 'wait..'
if sock in r:
cs,raddr=sock.accept()
t=threading.Thread(target=m,args=(cs,raddr))
t.setDaemon(1)
t.start()

下面为html页面:

<html>
<head>
<meta charset='utf8'/>
<title>WebSocket</title> <style>
html,body{font:normal 0.9em arial,helvetica;}
#log {width:440px; height:200px; border:1px solid #7F9DB9; overflow:auto;}
#msg {width:330px;}
</style> <script>
var socket; function init(){
var host = "ws://192.168.1.104:8888/";
try{
socket = new WebSocket(host);
socket.onopen = function(msg){ ; };
socket.onmessage = function(msg){ log(msg.data); };
socket.onclose = function(msg){ log("Lose Connection!"); };
}
catch(ex){ log(ex); }
$("msg").focus();
} function send(){
var txt,msg;
txt = $("msg");
msg = txt.value;
if(!msg){ alert("Message can not be empty"); return; }
txt.value="";
txt.focus();
try{ socket.send(msg); } catch(ex){ log(ex); }
} window.onbeforeunload=function(){
try{
socket.send('quit');
socket.close();
socket=null;
}
catch(ex){
log(ex);
}
}; function $(id){ return document.getElementById(id); }
function log(msg){ $("log").innerHTML+="<br>"+msg; }
function onkey(event){ if(event.keyCode==13){ send(); } }
</script> </head> <body onload="init()">
<h3>WebSocket</h3>
<br><br>
<div id="log"></div>
<input id="msg" type="textbox" onkeypress="onkey(event)"/>
<button onclick="send()">发送</button>
</body> </html>

  

python从socket做个websocket的聊天室server的更多相关文章

  1. Python基于Socket实现简易多人聊天室

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  2. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  3. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  4. WebSocket 网页聊天室

    先给大家开一个原始的websocket的连接使用范例 <?php /* * recv是从套接口接收数据,也就是拿过来,但是不知道是什么 * read是读取拿过来的数据,就是要知道recv过来的是 ...

  5. 基于WebSocket实现聊天室(Node)

    基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...

  6. websocket+golang聊天室

    原文地址: http://www.niu12.com/article/3 websocket+golang聊天室 main.go和index.html放在同一目录下 main.go package m ...

  7. Python实现网络图形化界面多人聊天室 - Windows

    Python实现网络图形化界面多人聊天室 - Windows 项目名称:网络多人聊天室图形界面版本 项目思路: server.py 服务端文件,主进程中,创建图形化界面,询问地址(主机名,端口),点击 ...

  8. 关于websocket制作聊天室的的一些总结

    websocket的总结 在一个聊天室系统中,常常使用websocket作为通信的主要方式.参考地址:https://www.jianshu.com/p/00e... 关于自己的看法:websocke ...

  9. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

随机推荐

  1. WINFORM 自定义开关按钮控件-

    本文章转载:http://www.cnblogs.com/feiyangqingyun/archive/2013/06/15/3137597.html OK,大工告成,上图演示效果. 源码下载:htt ...

  2. ubuntu14.04中安装QuartusII9.1步骤

    家里的计算机安装了WIN10,出于够用且安装文件小,想安装QuartusII9.1,按M$风格,驱动绝对是安不上的.正好是双系统ubuntu14.04 64位.安装过程不太顺利,记录下来,当作已经不灵 ...

  3. Swift利用闭包(closure)来实现传值--&gt;前后两个控制器的反向传值

    利用了大约一个多小时来搞明确OC中Blocks反向传值和Swift中Closure反向传值的区别,以下直接贴上代码: 一.第一个界面 // Created by 秦志伟 on 14-6-13. imp ...

  4. RHCA442学习笔记-Unit10内存地址及分配

      Unit 10 Memory Addressing and Allocation 内存地址及分配 学习目标: A. 虚拟地址与物理地 B. 调整内存地址分配 C. 解析内存溢出    10.1 O ...

  5. Bash String Manipulation Examples – Length, Substring, Find and Replace--reference

    In bash shell, when you use a dollar sign followed by a variable name, shell expands the variable wi ...

  6. Java基础知识强化之集合框架笔记66:Map集合面试题之HashMap和Hashtable区别(重要)

    1. HashMap和Hashtable区别 ? • Hashtable:线程安全,效率低.不允许null键和null值 • HashMap:线程不安全,效率高.允许null键和null值 packa ...

  7. 提升资源利用率的MapReduce框架

    Hadoop系统提供了MapReduce计算框架的开源实现,像Yahoo!.Facebook.淘宝.中移动.百度.腾讯等公司都在借助 Hadoop进行海量数据处理.Hadoop系统性能不仅取决于任务调 ...

  8. 让你一分钟认识电子身份验证系统EID

    什么是EID eID是英文"Electronic Identity"的英文简称,中文名为"电子身份证"或"网络电子身份证",由公安部第三研究 ...

  9. 那天有个小孩跟我说LINQ(五)转载

    2  LINQ TO SQL(代码下载)      我们以一个简单的销售的业务数据库为例子         表结构很简单:Users(购买者(用户)表),Products(产品信息表),Sales(销 ...

  10. TCP调试助手

    网络开发经常要用到一些TCP&UDP的调试工具,搜集一些备用. 目前总结工具有(不分先后): chrome等自带调试器调试HTTP Fiddler(.NET)和Charles debugger ...