在学习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();
}
}
}
这仅仅是设计思路,有点简陋,只能从控制台发送接收消息