1. Uma breve introdução ao WebSocket
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.
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.
Código cliente (página inicial da web):
< %@ Page Language = "Java" PageEncoding = "Utf-8" %> <! Doctype html> <html> <head> <title> Tomcat Implementação de java backend websocket </title> </hheef> <body> welcome <br/> <input id = "" type = "text"/> <blot> OnClick = "CloseWebSocket ()"> Feche a conexão WebSocket </botão> <hr/> <div id = "message"> </div> </body> <script type = "text/javascript"> var websocket = null; // julga se o navegador atual suporta websocket if ('websocket' na janela) {websocket = new websocket ("ws: //172.16.98.31: 8080/websocket/websocket"); } else {alert ('navegador atual não suporta webSocket'); } // Método de retorno de chamada para erros em conexão websocket.onerror = function () {setMessageInnerHtml ("erro na conexão WebSocket"); }; // Método de retorno de chamada para conexão bem -sucedida websocket.onopen = function () {setMessageInnerHtml ("WebSocket Connection bem -sucedido"); } // Método de retorno de chamada para receber a mensagem websocket.onmessage = function (event) {setMessageInnerhtml (event.data); } // Método de retorno de chamada de conexão fechando 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 (); } // Mostrar a mensagem na função da página da web setMessageInnerHtml (innerHtml) {document.getElementById ('message'). Innerhtml + = innerhtml + '<br/>'; } // Fechar a função da conexão Websocket CloseWebSocket () {websocket.close (); } // Enviar função da mensagem send () {var message = document.getElementById ('text'). Value; websocket.send (mensagem); } </script> </html> Código de back -end da web java
pacote cn.com; 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 da URL de acesso ao terminal. O cliente pode se conectar ao lado do servidor Websocket através deste URL* sempre que uma solicitação for feita, uma instância será criada*/@serverendpoint ("/websocket") public class Websockettest {// Variáveis estáticas são 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 = 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 <websockettest> websocketset = new copyonWritearRaySet <sebsockettest> (); // A sessão de conexão com um determinado cliente precisa enviar dados para o cliente através da sessão privada de sessão; /*** Método para chamar com êxito o estabelecimento de conexão* @param Sessão Parâmetro opcional. A sessão é uma sessão de conexão com um cliente e precisa enviar dados para o cliente através dele*/ @Onopen public void Onopen (sessão de sessão) {this.session = session; websocketset.add (isto); // Adicionar ao addOnlineCount () no set; // Adicione 1 número de números on -line System.out.println ("Existe uma nova conexão para participar! O número atual de pessoas on -line é" + getOnlineCount ()); } / *** Método para conectar chamadas de fechamento* / @Onclose public void onclose () {websocketset.remove (this); // excluir subonlineCount () do set; // Exclua o número on -line por 1 número on -line System.out.println ("Há uma conexão fechada! O número atual de pessoas online é" + getOnlineCount ()); } / *** Método chamado após receber a mensagem do cliente* @param mensagem A mensagem enviada pelo cliente* @param Sessão Parâmetro opcional* / @onMessage public void onMessage (string message, Session Session) {System.out.println ("mensagem do cliente:" + mensagem); // Mensagem em lote para (WebSocketTest Item: WebSocketset) {tente {item.sendMessage (mensagem); } catch (ioexception e) {e.printStackTrace (); continuar; }}}} / ** * Chamado quando ocorre um erro * @param session * @param error * / @onerrror public void onError (sessão de sessão, erro de arremesso) {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. * Mensagem @param * @THOWS IOException */ public void sendMessage (string message) lança ioexception {this.session.getBasicRemote (). SendText (mensagem); //this.session.getasyncremote().sendText(Message); } public static sincronizado int getOnlineCount () {return onlineCount; } public static sincronizado void addonLineCount () {websockettest.onlinecount ++; } public static sincronizado void subonlineCount () {websockettest.onlinecount--; }}Abra dois navegadores, entre no URL e execute -o diretamente
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.