Android Socket之聊天室

来源:互联网 发布:js控制数据几个为一行 编辑:程序博客网 时间:2024/06/05 11:22

公司开发需要用到socket通信的一些应用,所以就大体了解了一些其中的原理,看了一些视频,模仿做了一个聊天室。


聊天室的开发需要在服务器端记录每一个连接的socket,并向各个客户端发送消息。

服务端代码如下:因为accept()是一个阻塞函数,所以应该放在一个线程中,并保持一直监听状态。

                             

package com.jld.textmyserversocket.main;public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}}

package com.jld.textmyserversocket.main;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JOptionPane;public class ServerListener extends Thread {@Overridepublic void run() {//1-65535try {ServerSocket serverSocket = new ServerSocket(12345);while (true) {//blockSocket socket = serverSocket.accept();//建立连接JOptionPane.showMessageDialog(null, "有客户端链接到了本机的12345端口");//将socket传递给新的线程ChatSocket cs = new ChatSocket(socket);cs.start();ChatManager.getChatManager().add(cs);}} catch (IOException e) {e.printStackTrace();}}}
package com.jld.textmyserversocket.main;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.Socket;public class ChatSocket extends Thread {Socket socket;public ChatSocket(Socket s){this.socket = s;}public void out(String out) {try {socket.getOutputStream().write((out+"\n").getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {out("@success");try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));String line = null;while ((line = br.readLine()) != null) {System.out.println(line);ChatManager.getChatManager().publish(this, line);}br.close();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


package com.jld.textmyserversocket.main;import java.util.Vector;public class ChatManager {private ChatManager(){}private static final ChatManager cm = new ChatManager();public static ChatManager getChatManager() {return cm;}Vector<ChatSocket> vector = new Vector<ChatSocket>();public void add(ChatSocket cs) {vector.add(cs);}public void publish(ChatSocket cs,String out) {for (int i = 0; i < vector.size(); i++) {ChatSocket csChatSocket = vector.get(i);if (!cs.equals(csChatSocket)) {csChatSocket.out(out);}}}}

客户端代码如下:


package com.example.laozhou.mysocketclient;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.Socket;import java.net.UnknownHostException;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.os.Build;public class MainActivity extends Activity {    EditText ip;    EditText editText;    TextView text;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ip = (EditText) findViewById(R.id.edit1);        editText = (EditText) findViewById(R.id.edit2);        text = (TextView) findViewById(R.id.text);        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                connect();            }        });        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                send();            }        });    }    //-------------------------------------    Socket socket = null;    BufferedWriter writer = null;    BufferedReader reader = null;    public void connect() {        AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {            @Override            protected Void doInBackground(Void... arg0) {                try {                    socket = new Socket(ip.getText().toString(), 12345);                    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));                    publishProgress("@success");                } catch (UnknownHostException e1) {                    Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show();                } catch (IOException e1) {                    Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show();                }                try {                    String line;                    while ((line = reader.readLine())!= null) {                        publishProgress(line);                    }                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                return null;            }            @Override            protected void onProgressUpdate(String... values) {                if (values[0].equals("@success")) {                    Toast.makeText(MainActivity.this, "链接成功!", Toast.LENGTH_SHORT).show();                    text.append(values[0]+"\n");                }else{                    text.append("别人说:"+values[0]+"\n");                }                super.onProgressUpdate(values);            }        };        read.execute();    }    public void send() {        try {            text.append("我说:"+editText.getText().toString()+"\n");            writer.write(editText.getText().toString()+"\n");            writer.flush();            editText.setText("");        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}




0 0
原创粉丝点击