websocket.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. var websocket;
  2. var isCreatw = false;
  3. var title="";
  4. var win;
  5. var input;
  6. var isQj = true;
  7. var toUser="";
  8. function toUserMsg(toU){
  9. if((!isQj && toUser == toU) || toU == user){
  10. win.setTitle(title + "  (已连接) 【现在全局对话】");
  11. isQj = true;
  12. toUser = "";
  13. }else{
  14. win.setTitle(title + "  (已连接) 【现在单独与"+toU+"对话】");
  15. isQj = false;
  16. toUser = toU;
  17. }
  18. }
  19. //启动聊天窗口并连接聊天服务器
  20. function creatw() {
  21. if(isCreatw){
  22. alert("已经启动");
  23. return;
  24. }else{
  25. isCreatw = true;
  26. }
  27. //创建用户输入框
  28. input = Ext.create('Ext.form.field.HtmlEditor', {
  29. region : 'south',
  30. height : 120,
  31. enableFont : false,
  32. enableSourceEdit : false,
  33. enableAlignments : false,
  34. listeners : {
  35. initialize : function() {
  36. Ext.EventManager.on(me.input.getDoc(), {
  37. keyup : function(e) {
  38. if (e.ctrlKey === true
  39. && e.keyCode == 13) {
  40. e.preventDefault();
  41. e.stopPropagation();
  42. send();
  43. }
  44. }
  45. });
  46. }
  47. }
  48. });
  49. //创建消息展示容器
  50. var output = Ext.create('MessageContainer', {
  51. region : 'center'
  52. });
  53. var dialog = Ext.create('Ext.panel.Panel', {
  54. region : 'center',
  55. layout : 'border',
  56. items : [input, output],
  57. buttons : [{
  58. text : '发送',
  59. handler : send
  60. }]
  61. });
  62. //初始话WebSocket
  63. function initWebSocket() {
  64. if (window.WebSocket) {
  65. websocket = new WebSocket(encodeURI('ws://'+wimadress));
  66. websocket.onopen = function() {
  67. //连接成功
  68. win.setTitle(title + '  (已连接) 【现在全局对话】');
  69. websocket.send('FHadminqq313596790'+user);
  70. }
  71. websocket.onerror = function() {
  72. //连接失败
  73. win.setTitle(title + '  (连接发生错误)');
  74. }
  75. websocket.onclose = function() {
  76. //连接断开
  77. win.setTitle(title + '  (已经断开连接)');
  78. }
  79. //消息接收
  80. websocket.onmessage = function(message) {
  81. var message = JSON.parse(message.data);
  82. //接收用户发送的消息
  83. if (message.type == 'message') {
  84. output.receive(message);
  85. } else if (message.type == 'get_online_user') {
  86. //获取在线用户列表
  87. var root = onlineUser.getRootNode();
  88. Ext.each(message.list,function(user){
  89. var node = root.createNode({
  90. id : user,
  91. text : user,
  92. iconCls : 'user',
  93. leaf : true
  94. });
  95. root.appendChild(node);
  96. });
  97. } else if (message.type == 'user_join') {
  98. //用户上线
  99. var root = onlineUser.getRootNode();
  100. var user = message.user;
  101. var node = root.createNode({
  102. id : user,
  103. text : user,
  104. iconCls : 'user',
  105. leaf : true
  106. });
  107. root.appendChild(node);
  108. } else if (message.type == 'user_leave') {
  109. //用户下线
  110. var root = onlineUser.getRootNode();
  111. var user = message.user;
  112. var node = root.findChild('id',user);
  113. root.removeChild(node);
  114. }
  115. }
  116. }
  117. };
  118. //在线用户树
  119. var onlineUser = Ext.create('Ext.tree.Panel', {
  120. title : '在线用户',
  121. rootVisible : false,
  122. region : 'east',
  123. width : 150,
  124. lines : false,
  125. useArrows : true,
  126. autoScroll : true,
  127. split : true,
  128. iconCls : 'user-online',
  129. store : Ext.create('Ext.data.TreeStore', {
  130. root : {
  131. text : '在线用户',
  132. expanded : true,
  133. children : []
  134. }
  135. })
  136. });
  137. title = '欢迎您:' + user;
  138. //展示窗口
  139. win = Ext.create('Ext.window.Window', {
  140. title : title + '  (未连接)',
  141. layout : 'border',
  142. iconCls : 'user-win',
  143. minWidth : 650,
  144. minHeight : 460,
  145. width : 650,
  146. animateTarget : 'websocket_button',
  147. height : 460,
  148. items : [dialog,onlineUser],
  149. border : false,
  150. listeners : {
  151. render : function() {
  152. initWebSocket();
  153. }
  154. }
  155. });
  156. win.show();
  157. win.on("close",function(){
  158. websocket.send('LeaveFHadminqq313596790');
  159. isCreatw = false;
  160. });
  161. //发送消息
  162. function send() {
  163. var content = input.getValue();
  164. if(toUser != ""){content = "fhadmin886"+toUser+"fhfhadmin888" + content;}
  165. var message = {};
  166. if (websocket != null) {
  167. if (input.getValue()) {
  168. Ext.apply(message, {
  169. from : user,
  170. content : content,
  171. timestamp : new Date().getTime(),
  172. type : 'message'
  173. });
  174. websocket.send(JSON.stringify(message));
  175. //output.receive(message);
  176. input.setValue('');
  177. }
  178. } else {
  179. Ext.Msg.alert('提示', '您已经掉线,无法发送消息!');
  180. }
  181. }
  182. };
  183. //用于展示用户的聊天信息
  184. Ext.define('MessageContainer', {
  185. extend : 'Ext.view.View',
  186. trackOver : true,
  187. multiSelect : false,
  188. itemCls : 'l-im-message',
  189. itemSelector : 'div.l-im-message',
  190. overItemCls : 'l-im-message-over',
  191. selectedItemCls : 'l-im-message-selected',
  192. style : {
  193. overflow : 'auto',
  194. backgroundColor : '#fff'
  195. },
  196. tpl : [
  197. '<div class="l-im-message-warn">​欢迎使用FH Admin 即时通讯系统。</div>',
  198. '<tpl for=".">',
  199. '<div class="l-im-message">',
  200. '<div class="l-im-message-header l-im-message-header-{source}">{from} {timestamp}</div>',
  201. '<div class="l-im-message-body">{content}</div>', '</div>',
  202. '</tpl>'],
  203. messages : [],
  204. initComponent : function() {
  205. var me = this;
  206. me.messageModel = Ext.define('Leetop.im.MessageModel', {
  207. extend : 'Ext.data.Model',
  208. fields : ['from', 'timestamp', 'content', 'source']
  209. });
  210. me.store = Ext.create('Ext.data.Store', {
  211. model : 'Leetop.im.MessageModel',
  212. data : me.messages
  213. });
  214. me.callParent();
  215. },
  216. //将服务器推送的信息展示到页面中
  217. receive : function(message) {
  218. var me = this;
  219. message['timestamp'] = Ext.Date.format(new Date(message['timestamp']),
  220. 'H:i:s');
  221. if(message.from == user){
  222. message.source = 'self';
  223. }else{
  224. message.source = 'remote';
  225. }
  226. me.store.add(message);
  227. if (me.el.dom) {
  228. me.el.dom.scrollTop = me.el.dom.scrollHeight;
  229. }
  230. }
  231. });