1. Uma breve introdução ao WebSocket
O WebSocket Protocol é um novo protocolo para HTML5. Ele implementa a comunicação complexa complexa entre o navegador e o servidor. O aperto de mão inicial requer a ajuda das solicitações HTTP para concluir o aperto de mão.
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.
WebSocket Background
Apenas a comunicação unidirecional pode ser alcançada através do HTTP no navegador. O COMET pode simular a comunicação bidirecional até certo ponto, mas é baixa em eficiência e requer um bom suporte do servidor; O soquete e o XMLSocket no Flash podem realizar a verdadeira comunicação bidirecional, e essas duas funções podem ser usadas no JavaScript através da Flex Ajax Bridge. Pode ser previsível que, se o WebSocket for implementado no navegador, ele substituirá as duas tecnologias acima e será amplamente utilizado. Diante dessa situação, o HTML5 define o protocolo WebSocket, que pode salvar melhor os recursos do servidor e a largura de banda e obter comunicação em tempo real.
O protocolo WebSocket também é implementado em Javaee7.
Sabemos que 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 inconveniência aos 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 em tempo real: as funções de tecnologia 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.
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.
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 seguinte código de demonstração também precisa ser implantado no tomcat7.0.47 ou acima para ser executado.
2. Exemplo WebSocket
2.1. Crie um novo projeto de teste Javaweb
Adicione a dependência do pacote JAR no pom.xml
<Ependency> <voupid> javax </frugiD> <TRAFACTID> javaee-api </artifactId> <versão>. </sipers> <cope> fornecido </scope> </dependency>
Código cliente (página inicial da web):
< %@ Page Language = "Java" PageEncoding = "Utf-" %> <! Doctype html> <html> <head> <title> TomCat Implementação do backend java webSocket </title> </weft> <body> welcome <br/br/> <input id = "" type = "text"/> <butt> onClick = " OnClick = "ClosewebSocket ()"> Feche a conexão com o webSocket </butut> <hr/> <div id = "message"> </div> </body> <script type = "text/javaScript"> var websocket = null; // determinar Websocketf (Web)/WebSocket/Websocket; Websocket; {alert ('navegador atual não suporta webSocket')} // Método de retorno de chamada para erros em conexão websocket.onerror = function () {setMessageInnerHtml ("WebSocket Connection Errors em websocket");}; // método de retorno de chamada para conexão bem -sucedida WebSocket.OnOpen = function () {setMeSessageInHtml (SetmEnner; webSocket.onMessage = function (event) {SetMessageInnerHtml (event.data);} // Conexão Método de retorno de chamada fechado websocket.onclose = function () {setMessageInnerHtml ("conexão websocket fechada");} // 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 () {CloseWebSocket ();} // Mostra a mensagem na função da página da web setMessageInnerHtml (innerHtml) {document.getElementById ('message'). Close WebsketskEnk/WebSocket Websock {websocket.close ();} // Envie a função da mensagem send () {var message = document.getElementById ('text'). value; websocket.send (message);} </script> </html> Código de back -end da web java
pacote me.gacl.webSocket; importar java.io.ioexception; importar java.util.concurrent.copyonWritearRaySet; importar javax.websocket. Sua função é principalmente para definir a classe atual como um lado do servidor WebSocket. O valor da anotação será usado para ouvir a conexão do usuário com o endereço URL do acesso ao terminal do usuário. O cliente pode se conectar ao lado do servidor websocket através deste URL*/@serverEndPoint ("/websocket") public classe websockettest {// variáveis estáticas usadas para gravar o número atual de conexões on -line. Ele deve ser projetado para ser seguro para threads. private estático int onlineCount =; // O conjunto de thread-sáfe 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 tecla pode identificar o usuário do Usuário Private Static copywritearraySet <Wsockettest> websocketset = new copyonWritearRaySet <websockettest> (); // A sessão de conexão com uma determinada cliente precisa ser enviada para o cliente através de sessão privada;/***/*** Método; A sessão é uma sessão de conexão com um determinado cliente e precisa enviar dados para o cliente através dele*/@onopenpublic void ONOPEN (sessão de sessão) {this.session = session; websocketset.add (this); // Adicionar ao addOnlineCount () no set; // Adicionar ao System.out.println ("Existe uma nova conexão para ingressar! O número atual de pessoas on -line é" + getOnlineCount ());}/*** Método para conectar a chamada de fechamento*/@onclosePublic void onclose () {websocketset.remove (this); // excluir subonlineCount () do set; // decremento do número de números on -line.out.println ("Existe uma conexão fechada! O número atual de pessoas online é" + getOnLinCount ());}/*** Método chamado após receber a mensagem do cliente* @param mensagem A mensagem enviada pelo cliente* @param session Opcional Parameter*/ @shessagePublic Void Onmessage (string " mensagem); // Mensagem em lote para (WebSockettest Item: websocketset) {tente {item.sendMessage (message);} catch (ioexception e) {e.printStackTrace (); continua;}}}}/*** chamado quando ocorre um erro* @param session* @paramer error*/}} error) {System.out.println ("Ocorreu o erro"); error.printStackTrace ();}/*** Este método é diferente dos métodos acima. Não há anotação, é um método adicionado de acordo com suas necessidades. * @param mensagem* @THOWS IOException*/public void sendMessage (mensagem de string) lança ioexception {this.session.getBasicRemote (). SendText (message); // this.session.getAsyncremote (). SendText (message); addonlineCount () {websockettest.onlinecount ++;} public static sincronizado void subonlineCount () {websockettest.onlinecount--;}} 1.2. Efeito de operação
Abra o navegador do Google e o Firefox Browser ao mesmo tempo para testes de simulação com vários clientes. O efeito de operação é o seguinte:
O conteúdo acima é o tutorial de exemplo para implementar o WebSocket pelo Java Backend Tomcat apresentado a você. Espero que seja útil para todos!