zoukankan      html  css  js  c++  java
  • 基于websocket的页面聊天程序

    注:主要的问题是当浏览器窗口直接关闭时,后台会报异常,因为后台还在继续向浏览器端写数据,但是浏览器已经关闭了,会报java.net.SocketException:peer:Socket write error异常。所以当我们把窗口关闭的时候要通知后台不要再向浏览器端写数据了,
    但是window.onclose(),经本人验证已经不起作用了(验证过程太尼玛恶心了),所以我采用另一种方法,使用body标签的onbeforeunload事件,这个事件是在页面刷新或者窗口关闭时触发,所以我在其触发函数中写入了 webSocket.close();来通知后台不要再向前段写数据了,然后webSocket连接就会自动断开,就不会有异常了。


    前台:
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
     
    var webSocket=new WebSocket('ws://localhost:8080/JavaWeb/websocket');
     webSocket.onerror = function(event) {
         onError(event)
       };
     
       webSocket.onopen = function(event) {
         onOpen(event)
       };
       webSocket.onmessage = function(event) {
         onMessage(event)
       };
     
       function onMessage(event) {
        
         document.getElementById('messages').innerHTML
           += '
    ' + event.data;
       }
     
       function onOpen(event) {
         document.getElementById('messages').innerHTML
           = 'Connection established';
       }
     
       function onError(event) {
         alert(event.data);
       }
            function start() {
              var content= document.getElementById('UserMessage').value;
              //webSocket.send('hello');
              webSocket.send(content);
              return false;
            }
            /*
            window.onclose()方法不管用,采用曲线救国的方法,
                     使用body标签的onbeforeunload事件,当整个页面刷新或把浏览器页面关闭的时候,通知后台断开websocket连接
            
            */
            function fnUnloadHandler(){
            webSocket.close();
            }  
    </script>
    </head>
    <body  onbeforeunload="fnUnloadHandler()">
      <div>
        <input id="UserMessage" type="text">
        <input type="submit" onclick="start()" />
      </div>
      <textarea id="messages" rows="10" cols="20"></textarea>
    </body>
    </html>
    

      

    后端:
    package WebSocket;
     
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Set;
    import javax.websocket.OnClose;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.ServerEndpoint;
    @ServerEndpoint("/websocket")
    public class demo1 {
    @OnMessage
    public void onMessage(String message,Session session) throws IOException, InterruptedException{
    System.out.println("Receive: "+message);
    //获取所有客户端的session,然后一旦接收到消息就为每一个客户端发送消息
    Set sessions=session.getOpenSessions();
    System.out.println(sessions.size());
    Iterator it=sessions.iterator();
    while(it.hasNext()){
    Session s1=(Session) it.next();
    s1.getBasicRemote().sendText(message);
    }
     
    }
    @OnOpen
     public void onOpen() {
       System.out.println("Client connected");
     }
     
     @OnClose
     public void onClose() {
       System.out.println("Connection closed");
     }
    }
    

      

     
  • 相关阅读:
    main函数的一些特性
    确保函数的操作不超出数组实参的边界
    今天学习了一点sed
    libevent 与事件驱动
    mvc3 action验证失败后的自定义处理
    使用spring.net+nibernate时如何用aspnet_regiis加密数据库连接字符串
    C# 中 IList IEnumable 转换成 List类型
    Nhibernate 过长的字符串报错 dehydration property
    小论接口(interface)和抽象类(abstract class)的区别
    C# 语言在函数参数列表中出现this关键词的作用
  • 原文地址:https://www.cnblogs.com/hujingwei/p/4947926.html
Copyright © 2011-2022 走看看