No artigo anterior, o Java Socket Chat Room Programming (1) usando o soquete para implementar o Push de mensagens de bate -papo, conversamos sobre como usar o soquete para fazer as mensagens passarem entre o servidor e o cliente para alcançar o objetivo de enviar mensagens. Em seguida, escreverei sobre como permitir que o servidor estabeleça comunicação entre o cliente e o cliente.
De fato, é para estabelecer uma comunicação de bate-papo individual.
É um pouco diferente do código anterior que implementou o empurrão de mensagens e foi modificado nele.
Se os métodos ou classes não forem mencionados, eles são exatamente os mesmos do artigo anterior.
1. Modifique a classe de entidade (a classe de entidade no servidor e o cliente é a mesma)
1. Tabela de informações do usuário do UserInfobean
classe pública classe userInfobean implementa serializável {private estático final seriialversionuid = 2l; privado userID; // user idprivate string nome de usuário; // nome de usuário string privado string likeName; // apelido de string privada userpwd; // senha de usuário private string userigon; // user avatar // omit e constituir métodos e seta}.2. Tabela de informações de bate -papo de MessageBean
classe pública MessageBean implementa serializável {private estático final serialversionUid = 1L; privado messageId; // Mensagem idprivate Long GroupID; // Grupo idprivate boolean isgoup; // se é uma mensagem de vídeo; Content privado string errorMsg; // mensagem de erro private int errorcode; // código de erro private int userId; // user idprivate int amizeid; // alvo amigo idprivate messageFileBean chatfile; // anexo de mensagem // omit get and set métodos}3. Tabela de anexo de mensagem de mensagem de file -file
public class MessageFileBean implementa serializável {private estático final seriialversionUid = 3L; privado int fileid; // arquivo idprivate string filename; // nome de arquivo privado longa fileLength; // comprimento de arquivo privado byte [] fileByte; // arquivo de arquivo privado string string; // arquivo de arquivo privado fileTitle; // filete; arquivo // file content string string;2. (Modificação do código lateral do servidor) Classe de serviço de bate -papo do ChatServer, modificada
public class Class ChatServer {// Serviço de soquete Servidor estático privado de servidor estático; // Use o ArrayList para armazenar toda a lista de soquetes <bocket> SocketList = new ArrayList <> (); // imita soketpublic map <Integer, socket> socketmap = new hashmap () // imitando informações sobre o usuário, no sloketMap Hashmap (); public gson gson = new gson ();/*** Inicialize o serviço de soquete*/public void initServer () {tente {// Crie um serverSocket para ouvir solicitações do cliente no portão 8080 servidor = new ServerSocket (Socketurls.port); CreateMessage ();} catch (IoException e) { blocke.printStackTrace ();}}/*** Crie gerenciamento de mensagens e continue recebendo mensagens*/private void createMessage () {try {System.out.println ("aguardando acesso ao usuário:"); // use aceitou () para bloquear o link para que o socket socket = socket.accept (); // Salvar o link do link do cliente para o sockets = ACECT. SocketList.add (soquete); System.out.println ("Acesso ao usuário:" + soquete.getport ()); // Abra um thread filho para aguardar outro soquete para entrar no novo thread (new Runnable () {public void run () {// Crie um serviço de soquete novamente para acessar outros usuários; Obtenha informações do cliente BFFEDER BFF = new BufferReader (new InputStreamReader (Socket.getInputStream ())); // Leia as informações do servidor enviadas linha string line = null; // looping para receber mensagens do soquete atual (True) {Thread.Sleep (500); // System.out.Println (" bff.readLine ())! = null) {// Analisar a classe Entidade messageBean messageBean = gson.fromjson (linha, messagebean.class); // Adicione as informações do usuário ao mapa, imite -as no banco de dados e memória // a classe de entidade é armazenada no dados e o soquete é armazenado na memória. O ID do usuário é usado como referência setChatMap (MessageBean, Socket); // Encaminhar a mensagem enviada pelo usuário ao amigo alvo getfriend (MessageBean); system.out.println ("user:" + userMap.get (MessageBean.getUserId ()). server.close ();} Catch (Exceção e) {// TODO GEMAGEM AUTOGERATION Blocke.printStackTrace (); System.out.println ("Error:" + E.getMessage ());}}}/*** Enviar uma mensagem*/private getMessage () {novo Thread (Runnable () {Publict (Publict) {Publict) (); {// Digite BufferERader do console strin = new BufferredReader (new InputStreamReader (system.in)); buffer = strin.readline (); // porque o readline usa uma nova linha como o ponto final, adicione um novo tampão de linha no servidor no servidor ("/n"; // e aqui é modificado para fazer mensagens para todos os usuários conectados ao servidor para o servidor para o servidor ("/n";/////, é o que é modificado para fazer mensagens para todos os usuários conectados ao servidor para o servidor ("/n"; socket.getOutputStream (); output.Write (buffer.getBytes ("utf-8")); // Envie dados de saída.flush ();}}} catch (ioexception e) {// ToAT Auto-Gerated Catch Blocke.printStackTrace ();}}}). MessageBean* @param scoket*/private void setChatmap (messageBean MessageBean, Socket Scoket) {// salve as informações do usuário se (userMap! getUserInfobean (MessageBean.getUserId ()));} // Salve o soquete vinculado correspondente if (SocketMap! = NULL && SocketMap.get (MessageBean.getUserID () == NULL) {SocketMap.put (MessageBean.getuserId ()); Aqui** @param userID* @return*/privado userInfobean getUserinfobean (int userId) {userInfobean userInfobean = new userInfobean (); userInfobean.setUsericon ("Usuário Avatar "); userInfobean.setUserID (userID); userInfobean.setUserName (" admin "); userInfobean.setUserpwd (" 123123132a "); retornar userInFobean;}/*** a mensagem para a mensagem de mestra** @ParamBean*/privado geting gin; && socketmap.get (messageBean.getFriendId ())! = null) {soquete socket = SocketMap.get (messageBean.getfriendid ()); string buffer = gson.tojson (messageBean); // porque o readline é o ponto final com uma nova linha, adicione um novo buffer de linha para o final += "/n"; socket.getOutputStream (); output.Write (buffer.getBytes ("utf-8")); // Envie dados output.flush ();} catch (ioexception e) {// TODO GANEGERATED BLOCKE.printStacktrace ();}}}}}}}}}}}}}}}}}}}3. (Código do cliente) A modificação da página de login de loginactividade pode fazer login em várias pessoas
classe pública LoginActivity estende AppCompatactivity {private edittext chat_name_text, chat_pwd_text; button privado chat_login_btn; @OverrideProtected void onCreate (bundle); (EdittExt) findViewById (r.id.chat_name_text); chat_pwd_text = (edittext) findViewbyid (r.id.chat_pwd_text); chat_login_btn = (botão) findviewbyid (r.id.chat_login_btn); chat_login_btn) {@OverridePublic void OnClick (view v) {int status = getLogin (chat_name_text.getText (). Tostring (). TRIM (), chat_pwd_text.getText (). Toast.Length_long) .Show (); retornar;} getChatserver (getLogin (chat_name_text.getText (). MainActivity.class); startActivity (intenção); finalize ();}});}/*** retornar ao status de login, 1 é o usuário e 2 é o outro usuário. Aqui, dois usuários são simulados para se comunicar ** @param nome* @param pwd* @return*/private int getLogin (nome da string, string pwd) {if (textUtils.isEmpty (nome) || textUtils.isempty (pwd) {return 0; 1; // user1} else if (name.equals ("admin") && pwd.equals ("2")) {return 2; // user2} else {return -1; // error de senha}}/*** instancie um serviço de bate -papo ** @param status*/private void getchatServer (int status) {4. (Código do cliente) Modificação do Código de Serviço de ChatServer Chat lógica
classe pública ChatServer {soquete privado do soquete; manipulador privado manipulador; messageBean MessageBean privado; privado gson gson = new gson (); // Obtenha o fluxo de saída do objeto de soquete e constrói o PrintWriter Object PrintWriter PrintWriter; InputStream Input; Uattream; {initmessage (status); initchatSserver ();}/*** fila de mensagens, usada para passar mensagens ** @param manipulador*/public void setChathandler (manipulador de manipulador) {this.Handler = handler;} private void initchatServer () {// ABRIVE THREEN/REPENDENTE (INTIRMESSAGE); {MessageBean = new MessageBean (); UserinFobean UserInfobean = novo UserInfobean (); userInfobean.setUserID (2); messageBean.setMessageId (1); MessageBean.SetchAtType (1); UserinFobean.SetUserName ("admin"); UserInfobean.setUserpwd ("123123123a"); // e o IDIF do usuário do destino do bate -papo (status == 1) {// Se for o Usuário 1, ele aponta para o usuário 2 para conversar com MessageBean.setUserID (1); MessageBean.SetFriendId (2);} else if (status == 2) {// se for o usuário 2, ele apontará para o usuário 1 para ChatBean.seterid (2); MessageBean.SetFriendId (1);} ChatAppliaction.UserinFobean = UserInfobean;}/*** Envie uma mensagem ** @param contentmsg*/public void sendMessage (string contentmsg) {Try {if (socket == null) {message = handler.btainMesssage (); fechado "; handler.sendMessage (mensagem); return;} byte [] str = contentmsg.getBytes (" utf-8 "); // converte o conteúdo para utf-8string aaa = new string (str); MessageBean.SetContent (AAA); String messagejson = gson.tojson (MessageBean);/*** porque o readline () no servidor está bloqueando a leitura* se não puder ler o caractere novo ou o fluxo de saída termina, ele será bloqueado lá* para que um novo caractere de linha seja adicionado no final da mensagem JSON para dizer ao servidor que o servidor foi enviado** "/n" ;output.write(messagejson.getbytes("utf-8") ;// imprima a nova linha de caracteres em saída.flush (); // Refresh the output stream so that the Server receives the string immediately} catch (Exception e) {e.printStackTrace();Log.e("test", "Error:" + e.toString());}}/*** Receive the message and in the child thread */private void receiveMessage() {new Thread(new Runnable() {@Overridepublic void run() {try {// Send a solicitação do cliente para a porta nativa 8080 soquete = novo soquete (soqueteurls.ip, soqueteurls.port); // Obtenha o fluxo de entrada do objeto de soquete e construa o objeto buffersader correspondente PrintWriter = new PrintWriter (socket.getoutStream ()); input = socket.getStrEstReam; DataOutputStream (Socket.getOutputStream ()); // Obtenha informações do cliente BFFEDER BFF = new BufferredReader (new InputStreamReader (input)); // Leia as informações do servidor enviadas Linha de String (True) {Thread.sleep (500); linha); messageBean messageBean = gson.fromjson (linha, messageBean.class); mensagem message = handler.obtainMessage (); message.obj = messageBean.getContent (); message.what = 1; handler.sendMessage (message); se (socket == null) quebra; Socket Socket Stream Socket.Close (); // Feche o soquete} Catch (Exceção e) {E.PrintStackTrace (); Log.e ("Test", "Error:" + E.ToString ());}}}}).Dessa forma, a lógica do código foi modificada da lógica da mensagem, empurre para a lógica do bate -papo único.
Esse código permite que o usuário 1 e o usuário 2 conversem entre si, e o servidor gravará o histórico de bate -papo entre eles. E o servidor também tem a função do esforço de mensagem.
O acima é que a programação da sala de bate -papo Java é apresentada pelo editor (ii) usando o soquete para implementar uma única sala de bate -papo. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!