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

  

  1. #coding:utf8
  2. import socket,select
  3. import SocketServer
  4. import hashlib,base64,time
  5. from pprint import pprint
  6.  
  7. #author:lijim
  8. def f(key):
  9.  
  10. s=key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
  11. sha1=hashlib.sha1(s)
  12. dig=sha1.digest()
  13. return base64.encodestring(dig).strip()
  14.  
  15. def parse_data(msg):
  16. code_length = ord(msg[1]) & 127
  17.  
  18. if code_length == 126:
  19. masks = msg[4:8]
  20. data = msg[8:]
  21. elif code_length == 127:
  22. masks = msg[10:14]
  23. data = msg[14:]
  24. else:
  25. masks = msg[2:6]
  26. data = msg[6:]
  27.  
  28. i = 0
  29. raw_str = ''
  30.  
  31. for d in data:
  32. raw_str += chr(ord(d) ^ ord(masks[i%4]))
  33. i += 1
  34. return raw_str
  35. def send_data(raw_str):
  36. back_str = []
  37.  
  38. back_str.append('\x81')
  39. data_length = len(raw_str)
  40.  
  41. if data_length < 125:
  42. back_str.append(chr(data_length))
  43. else:
  44. back_str.append(chr(126))
  45. back_str.append(chr(data_length >> 8))
  46. back_str.append(chr(data_length & 0xFF))
  47.  
  48. back_str = "".join(back_str) + raw_str
  49. return back_str
  50.  
  51. gmsg=None
  52.  
  53. def m(cs,raddr):
  54. print raddr
  55. req= cs.recv(8*1024)
  56. print 'request:\n',req
  57. print '-'*20+'\n'
  58.  
  59. tmplist=req.split("\r\n")
  60. headers={}
  61. get=tmplist.pop(0)
  62. for i in tmplist:
  63. if i.find(":") !=-1:
  64.  
  65. item=i.split(":")
  66.  
  67. headers[item[0]]=item[1].strip()
  68. # pprint(headers)
  69. key=headers.get("Sec-WebSocket-Key","")
  70. print '-'*20
  71. print 'key:',key
  72. accept=f(key)
  73. print '-'*20+'\n'
  74. ends=websocktemplate%(accept,headers.get("Sec-WebSocket-Origin","NULL").strip(),headers.get("Host","").strip(),)
  75.  
  76. print 'response:\n'
  77. print ends
  78. cs.send(ends)
  79. print '-'*20
  80. global gmsg
  81. while 1:
  82. try:
  83. r,w,e=select.select([cs,],[],[],0.5)
  84. if gmsg:
  85. cs.send(send_data(str(raddr)+':'+gmsg))
  86. gmsg=None
  87.  
  88. if cs in r:
  89. msg=cs.recv(8*1024)
  90. if msg:
  91. data=parse_data(msg)
  92.  
  93. if data!='close':
  94. gmsg=data
  95. print '%s:%s'%(raddr,data)
  96. cs.send(send_data(str(raddr)+':'+data))
  97. else:
  98.  
  99. break
  100.  
  101. except:
  102. cs.close()
  103.  
  104. ## cs.shutdown(2)
  105. ## cs.close()
  106. ## except KeyboardInterrupt:
  107. ### sock.shutdown(1)
  108. ## sock.close()
  109. ## print 'stop.'
  110. ## break
  111.  
  112. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  113.  
  114. address=("192.168.1.104",8888)
  115. sock.bind(address)
  116. sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  117. sock.listen(20)
  118.  
  119. websocktemplate=''.join(["HTTP/1.1 101 Switching Protocols\r\n"
  120. ,"content-type:charset=utf-8\r\n"
  121. ,"Upgrade:websocket\r\n"
  122. ,"Connection: Upgrade\r\n"
  123. ,"Sec-WebSocket-Accept:%s\r\n"
  124. ,"WebSocket-Origin:%s\r\n"
  125. ,"WebSocket-Location: ws://%s/WebManagerSocket\r\n"
  126. ,"WebSocket-Protocol:WebManagerSocket\r\n\r\n"])
  127.  
  128. import threading
  129. while 1:
  130. r,w,e=select.select([sock,],[],[],1)
  131. print 'wait..'
  132. if sock in r:
  133. cs,raddr=sock.accept()
  134. t=threading.Thread(target=m,args=(cs,raddr))
  135. t.setDaemon(1)
  136. t.start()

下面为html页面:

  1. <html>
  2. <head>
  3. <meta charset='utf8'/>
  4. <title>WebSocket</title>
  5.  
  6. <style>
  7. html,body{font:normal 0.9em arial,helvetica;}
  8. #log {width:440px; height:200px; border:1px solid #7F9DB9; overflow:auto;}
  9. #msg {width:330px;}
  10. </style>
  11.  
  12. <script>
  13. var socket;
  14.  
  15. function init(){
  16. var host = "ws://192.168.1.104:8888/";
  17. try{
  18. socket = new WebSocket(host);
  19. socket.onopen = function(msg){ ; };
  20. socket.onmessage = function(msg){ log(msg.data); };
  21. socket.onclose = function(msg){ log("Lose Connection!"); };
  22. }
  23. catch(ex){ log(ex); }
  24. $("msg").focus();
  25. }
  26.  
  27. function send(){
  28. var txt,msg;
  29. txt = $("msg");
  30. msg = txt.value;
  31. if(!msg){ alert("Message can not be empty"); return; }
  32. txt.value="";
  33. txt.focus();
  34. try{ socket.send(msg); } catch(ex){ log(ex); }
  35. }
  36.  
  37. window.onbeforeunload=function(){
  38. try{
  39. socket.send('quit');
  40. socket.close();
  41. socket=null;
  42. }
  43. catch(ex){
  44. log(ex);
  45. }
  46. };
  47.  
  48. function $(id){ return document.getElementById(id); }
  49. function log(msg){ $("log").innerHTML+="<br>"+msg; }
  50. function onkey(event){ if(event.keyCode==13){ send(); } }
  51. </script>
  52.  
  53. </head>
  54.  
  55. <body onload="init()">
  56. <h3>WebSocket</h3>
  57. <br><br>
  58. <div id="log"></div>
  59. <input id="msg" type="textbox" onkeypress="onkey(event)"/>
  60. <button onclick="send()">发送</button>
  61. </body>
  62.  
  63. </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. dubbo使用方法

    dubbo使用方法. Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载. ...

  2. Spring mvc Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  3. html笔记04:在html之中导入css两种常见方法

    1.导入式: <html> <head> <title></title> <style type="text/css"> ...

  4. Android(java)学习笔记155:如何让你的GridView不再滚动

    GridView显示不完整的原因是因为,他的外层也套用了一个滑动的控件,这个解决办法是:重写GridView,是控制GridView不能滚动,就是写一个类继承GridView   代码如下: publ ...

  5. Android开发——避免内存泄露

    本文翻译自Avoiding memory leak——Post by Romain Guy 著作权归原作者所有.转载请注明出处,由JohnTsai翻译 Android应用被分配的堆的大小限制为16MB ...

  6. angularjs填写表单

    https://scotch.io/tutorials/handling-checkboxes-and-radio-buttons-in-angular-forms <!DOCTYPE html ...

  7. Linux理念

    1.小即是美 2.让程序只做好一件事 3.可移植性比效率更重要 4.一切即文件——使用方便而且吧硬件作为文件处理是安全的 5.使用shell脚本来提高效率和可移植性 6.避免使用可定制性低下的用户界面 ...

  8. overflow:hiddden与绝对定位的应用场景的事例

    做一个点击查看显示详细信息的效果. 说一下问题描述,最外面的父元素overflow-parent设置了overflow:hidden, 然后子元素overflow-child没有设置overflow, ...

  9. w3c 学习html DOM

    什么是DOM? DOM是W3C标准,定义了访问HTML 和 XML文档的标准 W3C 文档对象模型(DOM)是中立于平台和语言接口,它允许程序动态的访问和更新文档的内容.结构和样式. W3C DOM ...

  10. 20160408javaweb之JDBC ---PreparedStatement

    PreparedStatement 1.Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻 ...