在学习android时,想做一个多人聊天室,不知如何动手
想先做一个纯java的简单多人聊天室,理理思路
通过Socket套接字进行数据传输
用到的知识点是:Socket,ServerSocket, 多线程
服务器程序:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; import java.net.UnknownHostException; import java.util.ArrayList; //这个程序是被连接的程序,俗称服务器程序 //在程序界中,网络是指2个程序产生信息交互,那么构成网络 //所以网络必须要有2个程序以上,一端叫服务器,一端叫客户端,通常服务器和客户端的对应关系是1-N public class SimpleServer { //用于保存当前连接的用户 public static ArrayList<Socket> socketList=new ArrayList<Socket>(); public static void main(String[] args)throws Exception { //创建一个serverSocket,用于监听客户端Socket的连接请求 ServerSocket serverSocket = new ServerSocket(10002);//10002为此服务器的端口号 System.out.println("服务启动"); //采用循环不断接收来自客户端的请求 while (true) { //每当接收到客户端的请求时,服务器端也对应产生一个Socket Socket socket = serverSocket.accept(); System.out.println("服务连接"); // 把连接的客户端加入到list列表中 socketList.add(socket); //启动一个新的线程 //任务线程,每个连接用都有一个属于自己专用的任务线程 //这个线程内会处理信息的发送和响应 new MyThread(socket,socketList).start(); } /* BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); // 把输入的内容输出到client while (true) { String msg = br.readLine(); pw.println("服务器说:" + msg); }*/ } } class MyThread extends Thread { Socket client; ArrayList<Socket> clients; BufferedReader br; public MyThread(Socket client,ArrayList<Socket> clients)throws Exception { super(); this.client = client; this.clients = clients; br = new BufferedReader(new InputStreamReader(this.client.getInputStream())); } //把接收到的消息发送给各客户端 public void run() { try { String content=null; while(true){ //从某个客户端读取信息 if((content=br.readLine())!=null) { for(Socket socket:clients){ if(client!=socket){ //把读取到的消息发送给各个客户端 PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); pw.println(content); } } content = URLDecoder.decode(content, "UTF-8"); System.out.println(content); } } }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端程序:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.URLDecoder; import java.net.URLEncoder; public class Client { /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //创建连接到本机,端口为10002的socket Socket client = new Socket("192.168.3.26", 10002); new MyThread(client).start(); InputStream is = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); while (true) { String msg = br.readLine(); //对收到的信息进行解码 msg=URLDecoder.decode(msg, "UTF-8"); System.out.println(msg); } } } class MyThread extends Thread { Socket client; public MyThread(Socket client) { super(); this.client = client; } public void run() { // 发出消息 try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); PrintWriter pw = new PrintWriter(client.getOutputStream(), true); // 把输入的内容输出到socket while (true) { String msg = br.readLine(); //对发出的消息进行编码 msg = URLEncoder.encode("张三说:" + msg, "UTF-8"); pw.println(msg); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这仅仅是设计思路,有点简陋,只能从控制台发送接收消息