Como implementar o websocket no tomcat
O protocolo WebSocket pertence ao padrão HTML5, e mais e mais navegadores suportam nativamente o WebSocket, o que permite que clientes e servidores obtenham comunicação bidirecional. Depois de estabelecer uma conexão do WebSocket entre o cliente e o servidor, a mensagem do lado do servidor pode ser enviada diretamente ao cliente, quebrando assim o modo de resposta tradicional de solicitação e evitando solicitações sem sentido. Por exemplo, a maneira tradicional pode usar o AJAX para solicitar continuamente o lado do servidor, enquanto o WebSocket pode enviar diretamente dados para o cliente e o cliente não precisa solicitá -lo. Ao mesmo tempo, graças ao suporte ao navegador nativo, a redação de aplicativos de clientes se tornou mais conveniente e não precisa confiar em plug-ins de terceiros. Além disso, o WebSocket Protocol abandona os cabeçalhos de solicitação pesada do protocolo HTTP, mas o transmite na forma de quadros de dados, o que é mais eficiente.
A imagem mostra o processo de comunicação do WebSocket Protocol. Primeiro, o cliente enviará um pacote de handshake para informar ao servidor que desejo atualizar para o WebSocket. Não sei se o seu servidor concorda. No momento, se o servidor suportar o WebSocket Protocol, ele retornará um pacote de handshake para dizer ao cliente que não há problema e a atualização foi confirmada. Em seguida, uma conexão WebSocket foi estabelecida com sucesso, que suporta comunicação bidirecional e envia mensagens usando o formato do quadro de dados do protocolo Websocket.
O processo de aperto de mão precisa ser explicado. Para tornar o protocolo Websocket compatível com a arquitetura da Web do protocolo HTTP existente, o aperto de mão do protocolo WebSocket deve ser baseado no protocolo HTTP. Por exemplo, o cliente enviará mensagens HTTP semelhantes às seguintes à solicitação do servidor para atualizar para o protocolo Websocket. The Upgrade: WebSocket diz ao servidor que eu quero atualizar o protocolo:
Get WS: // Localhost: 8080/Hello HTTP/1.1 Origem: http: // localhost: 8080 Conexão: Upgrade Host: Localhost: 8080 sec-websocket-key: urovsczjnol/umbtt5ukmw == Upgrade: websocket secwesocket-version 13
No momento, se o servidor suportar o protocolo Websocket, ele enviará uma mensagem que concorda com o protocolo de atualização do cliente. A mensagem específica é semelhante ao seguinte, onde a atualização: a webSocket diz ao cliente que eu concordo com o seu protocolo de atualização:
HTTP/1.1 101 WebSocket Protocol Data do aperto de mão: Sex, 10 de fevereiro de 2016 17:38:18 Conexão GMT: Upgrade Server: Kaazing Gateway Upgrade: WebSocket Sec-WebSocket-Acept: RLHCKW/Skso9gah/Zsfhbatdkru =
Depois de concluir o aperto de mão como acima, a conexão do protocolo HTTP está quebrada. Em seguida, você começa a usar o protocolo WebSocket para se comunicar entre as duas partes. Essa conexão ainda é a conexão TCP/IP original e a porta ainda é o 80 ou 443 original.
Aqui está um exemplo simples de escrever websocket no tomcat:
classe pública hellowebsocketServlet estende WebSocketServlet {Private Static List <MensionInBound> SocketList = new ArrayList <MensionInBound> (); StreamInbound protegido CreateWebSocketInBound (String Subprotocol, HttpServletRequest Solicy) {Return New WebSocketMessageInBound (); } classe pública websocketmessageInbound estende MessageInbound {vazio protegido Onclose (int status) {super.onclose (status); SocketList.Remove (isto); } vazio protegido nopen (wsoutbound outbound) {super.onopen (saída); SocketList.add (isto); } @Override Protected void onBinaryMessage (mensagem de bytebuffer) lança ioexception {} @Override Protected void ontextMessage (mensagem de charbuffer) lança ioexception {para (messageInboundInbound: socketlist) {Charbuffer = Charbuffer.apffer (socketlist) {charbuffer = charbuffer.apffer; Wsoutbound outbound = messageInbound.getwsoutBound (); outbound.WriteTextMessage (buffer); outbound.flush (); }}}}Este servlet deve herdar o WebSocketServlet e, em seguida, criar uma classe WebSocketMessageInbound que herda MessageInbound. Preencha o Onclose, Onopen, OnbinaryMessage e OntextMessage nesta classe para concluir a lógica de cada evento. O ONOPEN será chamado quando uma conexão WebSocket for estabelecida, o OCLOSE será chamado quando um WebSocket for fechado, o OnBinaryMessage é chamado quando um dados de um cliente é recebido no modo binário e o OntextMessage é chamado quando os dados de um cliente são recebidos no modo de texto. O código acima implementa o efeito de uma transmissão.
De acordo com a lógica de processamento acima, a integração do WebSocket pelo Tomcat não será muito difícil. Isso significa que, se você encontrar uma solicitação de protocolo do WebSocket ao processar uma solicitação, fará processamento especial, manterá a conexão e chamará o Onclose, ONOPEN, OnBinaryMessage e OntextMessage dos métodos MessageInbound do WebSocketServlet no momento apropriado. Como geralmente é recomendável que o WebSocket seja usado no modo NIO, observe o protocolo Websocket Integration Mode Integration.
Conforme mostrado na figura, se a conexão do cliente do WebSocket for recebida pelo receptor e registrada na fila do niocannel, o componente do pesquisador continuará descansando se há um niocanal para manusear. Nesse caso, ele passará pelo pipeline de processamento para o servlet herdando o WebSocketServlet. O método Doget do WebSocketServlet lidará com o handshake da WebSocket e informará ao cliente de retorno para concordar com o contrato de atualização. Mais tarde, o Poller continuou se revezando para retirar o niocannel relacionado. Uma vez descoberto que o pipeline usando o protocolo WebSocket foi usado, ele chamaria o método MessageInbound para concluir o processamento de diferentes eventos, alcançando o suporte para o protocolo WebSocket.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!