Leitura relacionada: Java Socket Chat Room Programming (ii) Usando soquete para implementar uma única sala de bate -papo
Já existem muitos exemplos de uso de soquetes para implementar o bate -papo na Internet, mas eu já vi muitos deles e há mais ou menos problemas.
Aqui vou implementar um exemplo de bate -papo relativamente completo e explicar a lógica nele.
Como o soquete é relativamente grande, dividirei alguns artigos para escrever um exemplo de soquete relativamente completo.
Aqui, primeiro implementamos a função mais simples da comunicação e cliente do servidor-cliente para realizar o empurrão da mensagem.
Objetivo: o servidor estabelece uma conexão com o cliente. O cliente pode enviar mensagens para o servidor e o servidor pode empurrar mensagens para o cliente.
1. Crie um servidor de bate -papo de soquete usando Java
1. Socketurls determina o endereço IP e o número da porta
classe pública Socketurls {// Endereço IP public Final Static String ip = "192.168.1.110"; // Número da porta public final static int porta = 8888;}2. A entrada para o programa principal
classe pública Main {public static void main (string [] args) lança exceção {new ChatServer (). initServer ();}}3. Classe de entidade de feijão
UserInfobean
classe pública Main {public static void main (string [] args) lança exceção {new ChatServer (). initServer ();}}Chat MessageBean
public class MessageBean estende o userInfobean {private Long MessageId; // Mensagem idprivate Long GroupID; // Grupo idprivate boolean iSgoup; // Se é uma mensagem de grupo private int chattype; // Tipo de mensagem; 1, 1, text; errorcode; // código de erro // omita o método get/set}4. Serviço de bate -papo de ChatServer, o programa mais importante
public class Class ChatServer {// Serviço de Socoque Servidor estático privado Servidor; public gson gson = new GSON ();/*** Inicialize o serviço de soquete*/public void initServer () {tente {// Crie um servidorSocket para ouvir solicitações do cliente na porta 8080 = novo servidor (Sockurls.port); Crestemessdo); Catch blocke.printStackTrace ();}}/*** Crie gerenciamento de mensagens e continue recebendo mensagens*/private void createMessage () {try {System.out.println ("Waiting for User Acesso:"); // use () para bloquear e aguardar solicitações do cliente. Thread a aguardar outro soquete ingressar no novo thread (new runnable () {public void run () {CreateMessage ();}}). start (); // envie informações para o cliente outputing output = strocket.getoutStream (); // Obtenha informações do cliente BuffErader. new scanner (soket.getInputStream ()); new Thread (new Runnable () {public void run () {try {string buffer; while (true) {// enter buffersader do console strin = new buffersader (new inputStreamReader (System); += "/n" ;output.write(buffer.getbytes("utf-8") ;//, envie dados de saída.flush ();}} Catch (ioexception e) {// tOdo-gerkerated Blocke.printStacktrace ();}}}). Socoque while (true) {thread.sleep (500); // System.out.println ("Content:" + bff.readline ()); // obtenha as informações do cliente while (line = bff.readline ())! messageBean.getUserName ()); System.out.println ("Content:" + messageBean.getContent ());}} // server.close ();} catch (exceção e) {// oddo-gate Blocke.printStack (); system.out.println ("Error-Gerted:"2. O lado Android é usado como um lado móvel para se conectar ao servidor
1. Appliaction instancia um serviço de bate -papo global
classe pública ChatAppliaction estende o aplicativo {public static chatserver ChatServer; public static userInfobean userInfobean; @OverridePublic void onCreate () {super.oCreate ();}}2. O endereço IP e o número da porta são consistentes com o servidor
3. A força do bate -papo é a mesma do lado do servidor
4. Layout XML. Faça login, bate -papo
1. Faça login
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "match_parent" Android: layout_height = "match_pa Aluguel "Android: Orientation =" Vertical "> <edittExtandroid: id ="@+id/chat_name_text "Android: layout_width =" match_parent "Android: Layou t_Height = "wrap_content" Android: hint = "UserName" Android: text = "admin"/> <edittExtandroid: id = "@+id/chat_pwd_text" Android: Layout_width = " match_parent "Android: layout_height =" wrap_content "Android: hint =" senha "Android: text =" 123123123a "Android: inputType =" numberPassword " /> <Buttonandroid: id = "@+id/chat_login_btn" Android: layout_width = "match_parent" Android: layout_height = "wrap_content" Android: hint = "login"/> </linearLayout>
2. Chat
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" Android: layout_width = "Match_parent" Andro: Layout_Height " Ferramentas "verticais": context = ". Activity.MainActivity"> <ScrollViewAndroid: id = "@+id/scrollView" Android: layout_width = "match_parent" Android: layout_height = "0dp" Android: layout_weight = "0,9"> <linearLayoutandr OID: id = "@+id/chat_ly" Android: layout_width = "match_parent" Android: layout_height = "match_parent" Android: orientação = "vertical"> </linearlayout> </scrollView> <linearLayoutRoid: layout_width = match Ent "Android: Layout_Height =" WRAP_CONTENT "Android: Orientation =" Horizontal "> <edittExtandroid: id ="@+id/chat_et "Android: Layout_width =" 0dp "Android: Layout_height =" Match_parent "Andro: Layout_weight /><buttonandroid:id="@+id/send_btn"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="0.2"android:text="send "/> <linearlayout>
5. loginActivity Login
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) {if (getLogin (chat_name_text.getText (). Tostring (). TRIM (), chat_pwd_text.getText (). MainActivity.class); startActivity (intenção); finalize ();}}});} private boolean getLogin (nome da string, string pwd) {if (textUtils.isEmpty (name) || textUtils.isempty (pwd)) return; if (name.equals ("admin") & s) false;} private void getChatserver () {chatAppliaction.chatserver = new ChatServer ();}}6. Chat da MainActivity
classe pública MainActivity estende AppCompatactivity {private linearLayout chat_ly; private textview left_text, right_view; privado edittExt chat_et; botão privado send_btn; private ViewGroup.LayoutParams LayoutParams = ViewGroup.LayoutParams (ViewGroup.Layoutams.mactParams = ViewGroup.LayoutParams.wrap_content);@substituir o Void OnCreate (pacote savedInstancestate) {super.oCreate (savedInstancestate); setContentView (r.layout.Activity_Main); Chat_ly = (linearLayout) findviewid (R.Id.id.chat_main); Chat_ly = (linearlayout)) FindViewById (r.id.chat_et); send_btn = (Button) findViewById (r.id.send_btn); send_btn.setOnClickListener (new View.OnClickListener () {@OverridePublic Void OnClick (View V) {ChatAppliaction.chatserver.sendMessage (chat_et.getText (). Tostring (). TRIM ()); chat_ly.addview (initirtView (chat_et.getText (add (). {@OverridePublic void handleMessage (mensagem msg) {if (msg.what == 1) {// Depois de enviar de volta a mensagem, atualize uichat_ly.addview (initleftview (msg.obj.toString ());}}}); MessageContent) {Right_View = new TextView (this); right_view.setLayoutParams (layoutParams); right_view.setGravity (view.focus_right); right_view.settext (messagecontent); return; = new TextView (this); esquerd_text.setLayoutParams (layoutParams); esquerd_text.setGravity (view.focus_left); esquerd_text.settext (messageContent); return left_text;}}7. Logic de bate -papo de bate -papo, o mais importante
classe pública ChatServer {soquete privado; manipulador privado manipulador; messageBean MessageBean privado; private gson gson = new GSON (); // Obtenha o fluxo de saída do objeto de soquete e constrói o PrintWriter ObjectPriptReRTRITCHRITER; inputStream input; outputStream outputMatream DataTream (Public; Fila de mensagens, usada para passar mensagens ** @param manipulador*/public void setChathandler (manipulador de manipulador) {this.Handler = handler;} private void initchatServer () {// Abra o thread para receber a mensagem recebeu. MessageBean (); MessageBean.SetUserID (1); MessageBean.SetMessageId (1); MessageBean.SetchAtType (1); MessageBean.SetUserName ("admin"); ChatAppliaction.Userinfobean = MessageBean; null) {message message = handler.obtainMessage (); message.what = 1; message.obj = "o servidor foi fechado"; handler.sendMessage (message); return;} byte [] str = contentmsg.getBytes ("utf-8"); // Turn the Contents utf-8string aa = string ("utf-8"); // gira o conteúdo utf-8string aa = string ("utf-8"); 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 caractere nova linha seja adicionado no final da mensagem json para dizer ao servidor que a mensagem foi enviada**/messagejson += "/n"; imprimir output.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, 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); mensagem message = handler.ObtainMessage (); message.obj = line; message.what = 1; handler.sendMessage (message);} if (soquete == null) quebra;} output.close (); // fechar o soquete de saída input.close (); // encanta de sotaque (); {E.PrintStackTrace (); Log.e ("Test", "Error:" + E.ToString ());}}}). START ();}}}A propósito, todo o código foi concluído.
Essa demonstração pode permitir que o telefone celular envie mensagens para o servidor e o servidor para o telefone celular.
Essa demonstração pode ser considerada uma função de push, mas o impulso real não é tão simples. Como iniciante dos soquetes, você pode ver as idéias da programação do soquete.
O exposto acima está a programação da sala de bate -papo Java Socket introduzida pelo editor (1) para usar o soquete para implementar o push da mensagem 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!