Estabeleça uma única conexão bidirecional entre o cliente e o servidor, o que significa que o cliente precisa apenas enviar uma solicitação ao servidor e o servidor o processará. Enquanto espera por esse tempo continuar fazendo outro trabalho, todo o processo é assíncrono. Nesta série de tutoriais, os usuários serão guiados a usar a nova API JSON Parsing (JSR-353) no Java EE 7 no recipiente Glassfish 4 e use jQuery e bootstrap em combinação. Este artigo exige que os leitores tenham um certo conhecimento básico do princípio do HTML 5 WebSocket.
Diagrama de reprodução
Vamos primeiro olhar para as renderizações depois de concluir este tutorial, como mostrado abaixo:
Preparação
Estamos usando o JDK 7 e o MAVN 3 para construir a biblioteca.
<Properties> <undoSed.dir> $ {Project.build.directory}/endossed <Depencency> <voupid> javax </frugiD> <TRAFACTID> javaee-api </artifactId> <versão> 7.0 </sipers> <cope> fornecido </cope> </dependency> </de pendências> <frupt> <fuild> < plugins> <lugin> <voundid> org.apache.maven.plugins </frupid> <stifactId> maven-compiler-pplugin </artifactId> <versão> 3.1 </sipers> <figuration> <sou rce> 1.7 </fonte > <vog -Target> 1.7 </ -Target> <CompileRargudes> <ndorSedDirs> $ {endossed.dir} </ndorSeddirs> </pompileRargudes> </figuration> </plugin> <flugin> <rugnid> org.apache.maven.plugins </groupId> <stifactId> Maven-war-plugin </stutifactId> <versão> 2.3 </version> <figuration> <failonMissingWebxml> false </failommissingwebxml> </figurati em </plugin> <broupId> org.apache.
Ao mesmo tempo, para usar o Glassfish 4, os seguintes plug-ins precisam ser adicionados:
plugin> <PuerpId> org.glassfish.embedded </groupiD> <TRATIFACTID> maven-embebedded-glassfish-plugin </artifactId> <versão> 4.0 </versão <fi Gracation> <lagePrefix> incorporado-glassfish </GoalPrefix> <pp> $ {baseado}/target/$ {Project.artifactId}-$ {Project.version} .war </pp> <utododelete> true </utododelete> <Port> 8080 </port> <name> $ { Project .artifactId} </name> <ContexTroot> Hascode </preplexTroot> </frifiguration> <Comestions> <Execution> <lects> <lection> implantar </as Goal> </metas> </exe cução> </execuções> </ plugin>
Configurando o terminal do WebSocket
Vamos primeiro olhar para o código do servidor WebSocket da seguinte maneira e depois executar uma análise adicional:
pacote com.hascode.tutor; WebSocket .ONOPEN; decodificadores = chatmessagedecoder.class) classe pública ChatEndPoint {private Final Logger Log = Logger.getLogger (getClass (). getName ()); {log. String Room = (String) session.getUserProperties (). Get ("Room"); ) .get ("sala")) {s.getBasicRemote (). SendObject (chatmessage); }}
O seguinte analisa o código acima:
Use @ServerendPoint para definir um novo terminal, onde o valor especifica o URL e pode usar o parâmetro PathParams, assim como é usado no JAX-RS.
Portanto, o valor "/chat/{Room}" permite que o usuário se conecte a uma sala de bate -papo através do seguinte URL: WS: //0.0.0.0: 8080/hascode/chat/java
O valor nos aparelhos (ou seja, sala) pode ser injetado como um parâmetro no método de retorno de chamada do ciclo de vida do endpoint usando javax.websocket.server.pathparam.
Além disso, queremos usar uma classe codificada e decodificada porque estamos usando uma classe DTO usada para transferir dados no lado do servidor e do cliente.
Quando o usuário se conecta ao servidor pela primeira vez e entra no número da sala para entrar na sala de bate -papo, o número da sala será injetado no envio na forma de parâmetros e o valor é salvo no mapa de propriedades do usuário usando a sessão. getUserProperties.
Quando um participante de bate -papo envia informações para o servidor através da conexão TCP, ele passa por todas as sessões abertas, cada sessão está vinculada à sala de bate -papo especificada e recebe informações codificadas e decodificadas.
Se quisermos enviar informações ou informações simples de texto em formato binário, podemos usar session.getBasicRemote (). Sendbinary () ou session.getBasicRemote (). SendText ()
Em seguida, vejamos o código usado para representar a entidade de transferência de informações (DTO: objeto de transferência de dados), como segue:
pacote com.hascode.tutorial;
Conversão de mensagens de bate -papo
Neste aplicativo, uma classe de codificação e decodificação será gravada para converter entre informações de bate -papo e formato JSON.
Vamos primeiro analisar a implementação da classe de decodificação, que converterá as informações de bate -papo passadas para o servidor para a classe ChatMessage Entity. Aqui, a especificação da API JAVA para o processamento JSON (JSR353) é usada para converter informações de formato JSON em classes de entidade.
pacote com.hascode.tutor; importar javax.websocket.endpointConfig; lança Decodeexception {chatmessage chatmessage = new chatmessage (); getString ("remetente");
Vejamos o código da classe de codificação.
pacote com.hascode.tutor; void init (final endpointConfig config) {} @Override public void Destroy () {} @Override public String Encode (Final ChatMessage ChatMessage) lança a Deseption {return json.createbjectbuilder () .add ("message", chatmessage.getmessage () ).
Aqui você pode ver o poderoso poder do JSR-353.
Construa um cliente simples através do bootstrap e javacsript
Por fim, usamos de maneira abrangente a famosa Bootstrap, JQuery Framework e JavaScript para projetar um cliente simples. Criamos um novo arquivo index.html no diretório SRC/Main/Weapp, e o código é o seguinte:
<! Doctype html> <html lang = "en"> <head> [..] <sCript> var wsocket; VAR $ Mensagem; ); .Message + '</td> </tr>'); "," remetente ":" ' + $ apelido.val () +' "," recebido ":" "} '; wsocket.send (msg); $ message.val (' '). ConnectTochatServer () {Room = $ ('Opção de sala de chat: selecionada'). Val (); $ chatwindow.empty (); function () {$ apelido = $ ('#apelido'); $ apelido.focus (); + apelido.val () + "@" + sala); }); ) :::::::::::::::::: :::::::::: :::::::::::::::::ioneone :::::::::::::::::::ionee ::::::::::::::::::::::::::: : ::::::::::::::::::::::Here :::::::::::::::::::hee :::::::::::::::::heo the ::::::::::::::::::::::::::::::; formulário> <H2> CHAT INSCONHENTE </H2> <Label para = "apelido"> apelido </celt> <input type = "text" placeholder = "apelido" id = "apelido"> <div> <gravador para = "Chatroom"> Chatroom </belt> <select size = "1" id = "chatroom"> <pution> arduino </ :::::::::::::::::::::::hee :::::::::::::::::::::::one ::::::::::::::::::::::::oheo. : ::::::::::::::::::::::Here :::::::::::::::::::hee :::::::::::::::::heo the : ::::::::::::::::::::::Here :::::::::::::::::::hee :::::::::::::::::heo the :::::: opption> <pution> java </pption> <pution> groovy </pption> <pution> scala </pption> </leclect> </div> "> Entrar </botão> </morm> </div> <!-/contêiner-> <div> <form id =" do-chat "> <h2> </h2> <tabela id =" Resposta "> </ tabela> <dieldset> <legend> insira sua mensagem .. </legend> <div> <input type =" text "placeholder =" Sua mensagem ... "id =" message "style =" altura "altura : 60px "/> <input type =" submite "value =" enviar message "/> <butter type =" button "id =" letwer-room "> deixar espaço </butut> </div> </fieldset> < /form> </div> </body> </html>
No código acima, preste atenção aos seguintes pontos:
Se você deseja chamar WebSocket no lado JavaScript, deve iniciar a conexão da seguinte maneira: ws: // ip: porta/context_path/endpoint_url por exemplo, ws: //0.0.0.0: 8080/hascode/chat/java
O método de criar uma conexão WebSocket é muito simples, usando var wsocket = new websocket ('ws: //0.0.0.0: 8080/hascode/chat/java');
Para obter as informações retornadas do servidor, você só precisa definir o método correspondente para obter as informações de retorno na função de retorno de chamada wsocket.onMessage.
Envie uma mensagem do WebSocket para o servidor, usando o wsocket.send (), onde as mensagens que podem ser enviadas podem ser dados de texto ou binário.
关闭连接使用的是wsocket.close()。
Finalmente, implantamos o código através do pacote MVN incorporado de vidro: execução e, em seguida, podemos ver o efeito da captura de tela no início deste artigo.
O acima é uma sala de bate -papo implementada usando Javaee7, Websockets e Glassfish4.