WebSocket介绍和一个简单的聊天室

WebSocket是什么呢?

  WebSocket一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范,WebSocketAPI被W3C定为标准。

WebSocket 是独立的、创建在 TCP 上的协议,和 HTTP 的唯一关联是使用 HTTP 协议的101状态码进行协议切换,使用的 TCP 端口是80,可以用于绕过大多数防火墙的限制。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并允许数据进行双向传送。

目前常见的浏览器如 Chrome、IE、Firefox、Safari、Opera 等都支持 WebSocket,同时需要服务端程序支持 WebSocket。

    --------------------------------------------------------------------------------------

以上摘自wiki,总的来说websocket实现了服务器和浏览器之间的双向通信,摆脱了以往的一问一答的通信方式,可以自由地传输数据.

Websocket有什么优点?

  • 由于没有http头信息,所以传输的数据包很小
  • 服务器可以主动推送信息

Websocket的握手协议

还是照搬wiki上的例子,websocket在建立连接时,浏览器会向服务器发出如下请求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

这段请求会告诉服务器即将切换到websocket协议,如果服务器支持的话,会返回如下信息

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/

至此,握手阶段完成,服务器和浏览器之间可以开始发送和接收信息

使用Websocket实现一个简单的网页聊天室

  • 使用tomcat8的websocket-api
  • 参考tomcat自带的example

服务器端ChatServlet

package com.yc.chatroom;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.annotation.WebServlet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value="/websocket/chat")//指定客户端连接地址
public class ChatServlet {
  private static final long serialVersionUID = 1L;
  private static final String GUEST_PREFIX = "Guest";
  private static final AtomicInteger connectionIds = new AtomicInteger(0);
  private static final Set<ChatServlet> connections = new CopyOnWriteArraySet<ChatServlet>();
  private final String nickname;
  private Session session;
  public ChatServlet() {
    nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
  }
  @OnOpen
  public void start(Session session) {
    this.session = session;
    connections.add(this);
    String message = String.format("* %s %s", nickname, "has joined.");
    broadcast(message); //广播用户加入消息
  }
  @OnClose
  public void end() {
    connections.remove(this);
    String message = String.format("* %s %s", nickname, "has disconnected.");
    broadcast(message); //广播用户推出消息
  }
  @OnMessage
  public void incoming(String message) {
    // Never trust the client
    String filteredMessage = String.format("%s: %s", nickname, message.toString());
    broadcast(filteredMessage); //广播发送内容
  }
  @OnError
  public void onError(Throwable t) throws Throwable {
    t.printStackTrace();
  }
  private static void broadcast(String msg) {
    for (ChatServlet client : connections) {
      try {
        synchronized (client) {
          client.session.getBasicRemote().sendText(msg);//给每个人发送消息
        }
      } catch (IOException e) {
        connections.remove(client);
        try {
          client.session.close();
        } catch (IOException e1) {
          // Ignore
        }
        String message = String.format("* %s %s", client.nickname, "has been disconnected.");
        broadcast(message);
      }
    }
  }
}

浏览器端index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Apache Tomcat WebSocket Examples: Chat</title>
<style type="text/css">
input#chat {
  width: 410px
}
#console-container {
  width: 400px;
}
#console {
  border: 1px solid #CCCCCC;
  border-right-color: #999999;
  border-bottom-color: #999999;
  height: 170px;
  overflow-y: scroll;
  padding: 5px;
  width: 100%;
}
#console p {
  padding: 0;
  margin: 0;
}
</style>
</head>
<body>
  <div>
    <p>
      <input type="text" placeholder="type and press enter to chat"
        id="chat" />
    </p>
    <div id="console-container">
      <div id="console"></div>
    </div>
  </div>
</body>
<script type="text/javascript">
  /**
  *  指定要连接的websocket地址
  *  如果使用https,则使用wss://
  **/
  var socket = new WebSocket(‘ws://‘ + window.location.host+ ‘/chatroom/websocket/chat‘);

  //连接与服务器的连接
  socket.onopen = function() {
    showMsg(‘Info: WebSocket connection opened.‘);
    document.getElementById(‘chat‘).onkeydown = function(event) {
      if (event.keyCode == 13) {
        sendMsg();
      }
    };
  };
  //断开与服务器的连接
  socket.onclose = function() {
    document.getElementById(‘chat‘).onkeydown = null;
    showMsg(‘Info: WebSocket closed.‘);
  };
  //与服务器之间的通信
  socket.onmessage = function(message) {
    showMsg(message.data);
  };
  //显示消息
  function showMsg(message) {
    var console = document.getElementById(‘console‘);
    var p = document.createElement(‘p‘);
    p.style.wordWrap = ‘break-word‘;
    p.innerHTML = message;
    console.appendChild(p);
    while (console.childNodes.length > 25) {
      console.removeChild(console.firstChild);
    }
    console.scrollTop = console.scrollHeight;
  }
  //发送消息
  function sendMsg() {
    var message = document.getElementById(‘chat‘).value;
    if (message != ‘‘) {
      socket.send(message);
      document.getElementById(‘chat‘).value = ‘‘;
    }
  }
</script>

运行结果

一次打开两个窗口,用户依次为guest0, guest1

guest0:

guest1:

guest0退出:

原文链接地址:https://mssora.com/websocket-intro-and-chatroom/

时间: 2024-10-23 00:48:22

WebSocket介绍和一个简单的聊天室的相关文章

node实现一个简单的聊天室(认识一下socket)

边学边理解node的高深,今天写了一个聊天室的demo,很简单,认识一下socket node服务端代码 var express = require('express'); var app = express();//session固定写法 var session = require('express-session'); app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true })); /

简单的聊天室制作

简单的聊天室制作 一个简单的聊天室,主要是就两个部分,一部分就是我们进行的时候那个聊天窗口,另外一个就是背后的服务器,我们要写一个聊天窗口,也要写一个相对应的服务器. 做一个项目过程中,写一个代码很简单,但是把逻辑分析清楚,将制作的过程中所有的逻辑关系分析清楚是项目的最重要的环节. 下面的一步一步,将这个聊天室的制作过程一步一步制作出来. 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步: 第九步: 第十步: 第十一步: 这就是简单的聊天室的制作的过程.这样我们来看一

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

用Go语言实现一个简单的聊天机器人

一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量.分隔符.操作符.它们可以组成各种表达式和语句,而后者都无需以分号结尾. 标识符:程序实体,前者即为后者的名称. 关键字:被编程语言保留的字符序列,不能把它用作标识符. 字面量:值的一种标记法. 操作符==运算符:用于执行特定算术或逻辑操作的符号,操作的对象称为操作数. 数组:由若干相同类型的元素组成

通过python 构建一个简单的聊天服务器

构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使用 Telnet,客户机可以连接到 Python 聊天服务器上,并在全球范围内相互进行通信.提交到聊天服务器的消息可以由其他人进行查看(以及一些管理信息,例如客户机加入或离开聊天服务器).这个模型如图 1 所示. 图 1. 聊天服务器使用 select 方法来支持任意多个客户机 聊天服务器的一个重要

JAVA WebSocKet ( 简单的聊天室 )

1, 前端代码 登入页 -> login.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>聊天室登入接口</title> <script type="text/javascript" src="JavaScript/jQuery.js"></script> <

基于Server-Sent Event的简单在线聊天室

一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时如果有人回答了我们的问题,知乎就会即时提醒我们,再比如现在电子商务的在线客服功能.这些能大大提高用户体验的功能都是基于Web即时通信实现的. 普通HTTP流程 客户端从服务器端请求网页 服务器作出相应的反应 服务器返回相应到客户端 而由于HTTP请求是无状态的,也就是说每次请求完成后,HTTP链

使用Service Bus Topic 实现简单的聊天室

创建Service Bus能够參照: https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/ Azure Service Bus做广播和消息通知功能非常合适,而且能够订阅不同的Topic(不同的消息类型或不同的聊天室). 1. 首先须要安装Azure Service Bus的nuget package: 2. 建议安装Azure Ser