Com o desenvolvimento da Internet, os protocolos HTTP tradicionais têm sido difíceis de atender às necessidades cada vez mais complexas dos aplicativos da Web. Nos últimos anos, com o nascimento do HTML5, o protocolo WebSocket foi proposto. Ele realiza a comunicação complexa complexa entre o navegador e o servidor, expande a função de comunicação entre o navegador e o servidor e permite que o servidor envie ativamente dados para o cliente.
O protocolo HTTP tradicional é apátrida. Cada solicitação deve ser iniciada pelo cliente (como um navegador). Após o processamento, o servidor retorna o resultado da resposta. É difícil para o servidor enviar dados ativamente ao cliente. Esse tipo de cliente é a parte ativa e o servidor é a parte passiva. O modelo tradicional da Web causa menos problemas para aplicativos da Web com alterações de informações pouco frequentes, mas traz grande inconveniente para aplicativos da Web que envolvem informações em tempo real, como aplicativos com funções como comunicação instantânea, dados em tempo real, push de assinatura, etc. Antes que as especificações do WebSocket fossem propostas, os desenvolvedores geralmente usam soluções de trade-off para implementar essas funções altamente tempos em tempo real: as tecnologias e a conclusão e os desenvolvedores. De fato, o último é essencialmente um tipo de pesquisa, mas foi melhorado.
A pesquisa é a solução mais original para implementar aplicativos da Web em tempo real. A tecnologia de pesquisa exige que os clientes enviem periodicamente solicitações ao servidor em um intervalo de tempo definido e consultem frequentemente se existem novas alterações de dados. Obviamente, essa abordagem pode levar a muitas solicitações desnecessárias, desperdiçando recursos de tráfego e servidor.
A tecnologia do cometa pode ser dividida em longas pesquisas e streaming de tecnologia. A pesquisa longa melhora a tecnologia de votação acima mencionada, reduzindo os pedidos inúteis. Ele define um tempo de expiração para determinados dados e envia apenas uma solicitação ao servidor após a expiração dos dados; Esse mecanismo é adequado para situações em que as alterações de dados não são particularmente frequentes. A tecnologia de streaming geralmente se refere ao cliente usando uma janela oculta para estabelecer uma conexão longa HTTP com o servidor. O servidor atualizará constantemente o status de conexão para manter a conexão longa HTTP viva; Dessa forma, o servidor pode enviar dados ativamente ao cliente por meio dessa conexão longa; A tecnologia de streaming pode testar o desempenho do servidor em um grande ambiente de simultaneidade.
Ambas as tecnologias são baseadas no modo Solicitação-resposta e não são consideradas tecnologias em tempo real no verdadeiro sentido; Cada solicitação ou resposta de seus resíduos uma certa quantidade de tráfego nas mesmas informações do cabeçalho, e a complexidade do desenvolvimento também é alta.
** Juntamente com o lançamento do HTML5, o WebSocket realmente realiza a comunicação em tempo real da Web, fazendo com que o modo B/S tenha os recursos de comunicação em tempo real do modo C/S. ** O fluxo de trabalho do WebSocket é o seguinte: O navegador envia uma solicitação ao servidor para estabelecer uma conexão WebSocket através do JavaScript. Depois que a conexão do WebSocket é estabelecida com sucesso, o cliente e o servidor podem transmitir dados através da conexão TCP. Como a conexão do WebSocket é essencialmente uma conexão TCP, ela não requer que os dados repetidos do cabeçalho sejam transportados a cada transmissão; portanto, seu volume de transmissão de dados é muito menor que a tecnologia de pesquisa e cometa. Este artigo não introduz a especificação do WebSocket em detalhes, mas apresenta principalmente a implementação do Websocket na Web Java e usa o WebSocket para implementar uma sala de bate -papo.
O Javaee 7 criou o JSR-356: Java API para especificação do WebSocket. Muitos contêineres da Web, como Tomcat, Nginx, Jetty, etc., suportam o WebSocket. O TomCat suporta o WebSocket desde 7.0.27 e JSR-356 desde 7.0.47. O código a seguir também deve ser executado no tomcat7.0.27 ou acima.
Código do servidor WebSocket
// Esta anotação é usada para especificar um URI, através do qual o cliente pode se conectar ao WebSocket. Mapeamento de anotação semelhante a servlet. Não há necessidade de configurá -lo em web.xml. @ServerendPoint ("/websocket") classe pública websocketdemo {// variável estática usada para gravar o número atual de conexões on -line. Ele deve ser projetado para ser seguro para threads. Atomicinteger final estático privado onlineCount = new AtomicInteger (0); // O conjunto de thread-segue do pacote simultâneo é usado para armazenar o objeto MyWebSocket correspondente de cada cliente. Para perceber que o servidor se comunica com um único cliente, você pode usar o mapa para armazená -lo, onde a chave pode identificar o usuário privado de copywritearrayset <websocketDemo> websocketset = new copyonWritearRaySet <WsBocketDemo> (); // Defina um apelido de bate -papo que registra o apelido de string final privado do cliente; // Conecte uma sessão de conexão com um determinado cliente e você precisa enviar dados para a sessão privada do cliente; public webSocketDemo () {apelido = "Guest" + onLineCount.GetAndIncrement (); } / * * Use a anotação @Onopen para indicar o retorno após o link do cliente ser bem -sucedido. A sessão de parâmetros é o parâmetro opcional Esta sessão é uma sessão na especificação do WebSocket, representando uma sessão. Não httpSession */ @onopen public void onopen (sessão de sessão) {this.session = session; websocketset.add (isto); String message = string.format ("[%s,%s]", apelido, "Adicionar à sala de bate -papo"); transmissão (mensagem); System.out.println ("Onopen"); }/ * * Use a anotação @onMessage para indicar quando o cliente envia uma mensagem e o primeiro parâmetro indica os dados enviados pelo usuário. A sessão de parâmetros é um parâmetro opcional, que é consistente com a sessão no método onopen */@onMessage public void onMessage (mensagem da string, sessão de sessão) {// é claro, true system.out.println (this.session == Session); transmissão (string.format ("%s:%s", apelido, filtro (mensagem))); }/ ** Retorno de chamada depois que o usuário quebra o link, observe que esse método deve ser chamado depois que o cliente chama o método de link quebrado*/ @Onclose public void onclose () {websocketset.remove (this); String message = string.format ("[%s,%s]", apelido, "deixe o link da sala de bate -papo"); transmissão (mensagem); } // Massa completa Envie a transmissão privada void (String info) {for (websocketdemo w: websocketset) {try {synchronized (websocketdemo.class) {w.session.getBasicRemote (). SendText (info); }} catch (ioexception e) {System.out.println ("Envie a mensagem para o cliente"+w.nickname+"falhou ao enviar a mensagem"); websocketset.remove (w); tente {w.session.close (); } catch (ioexception e1) {} string message = string.format ("[%s,%s]", w.nickname, "desconectado"); transmissão (mensagem); }}} // pode fazer algumas solicitações de filtragem para mensagens do usuário, como bloquear palavras -chave, etc. . public static string filtro (mensagem string) {if (message == null) {return null; } retornar mensagem; }}Código cliente (página inicial da web):
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> Insira o título aqui </title> <script type = "text/javaScript"> var ws = new websocket ("ws: // localhost: 8080/websockettest/websocket"); / * * Ouça as mudanças nos três estados. JS irá retorno de chamada*/ ws.onopen = function (message) {}; ws.onclose = function (mensagem) {}; ws.onmessage = function (message) {showMessage (message.data); }; // Ouça o evento de fechamento da janela. Quando a janela estiver fechada, feche ativamente a conexão Websocket para impedir que a janela se fechasse antes que a conexão seja desconectada e o lado do servidor lançará exceções. window.onBeforeUnload = function () {ws.close (); }; // Fechar a função de conexão CloseWebSocket () {ws.close (); } // Envie uma função de mensagem send () {var input = document.getElementById ("msg"); Var text = input.Value; ws.send (texto); input.value = ""; } função showMessage (message) {var text = document.createTextNode (mensagem); var br = document.createElement ("Br") var div = document.getElementById ("showChatMessage"); div.appendChild (texto); Div.AppendChild (BR); }</script></head><body> <div id="show"> <div id="showChatMessage"></div> <input type="text" size="80" id="msg" name="msg" placeholder="enter chat content" /> <input type="button" value="send" id="sendBn" name="sendBn" name="sendBn" OnClick = "send ()"> </body> </html>Como mencionado acima, uma sala de bate -papo com função de bate -papo em grupo é concluída. Durante o processo de verificação, verificou-se que o uso do WebSocket pode concluir as solicitações de domínio cruzado.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.