Java简易聊天室
Java简易聊天室
支持多人向服务器端发送消息并由服务器发送至各个客户端服务器端代码:
[java]- /*
- * @topic:服务器端
- */
- import java.io.*;
- import java.net.*;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class Server{
- //服务器端口
- private static final int SERVERPORT = 8889 ;
- //客户端连接
- private static List<Socket> mClientList = new ArrayList<Socket>();
- //线程池
- private ExecutorService mExecutorService;
- //ServerSocket对象
- private ServerSocket mServerSocket;
- public static void main(String[] args){
- //System.out.println("Hello Landor!");
- new Server();
- }
- public Server(){
- try{
- //设置服务器端口
- mServerSocket = new ServerSocket(SERVERPORT);
- //创建一个线程池
- mExecutorService = Executors.newCachedThreadPool();
- System.out.println("wait client :");
- //用来临时保存客户端连接的Socket对象
- Socket client = null;
- while(true){
- //接收客户连接并添加到List中
- client = mServerSocket.accept();
- mClientList.add(client);
- //开启一个客户端线程
- mExecutorService.execute(new ThreadServer(client));
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- //每个客户端单独开启一个线程
- static class ThreadServer implements Runnable{
- private Socket mSocket;
- private BufferedReader mBufferedReader;
- private PrintWriter mPrintWriter;
- private String mStrMSG;
- public ThreadServer(Socket socket) throws IOException{
- this.mSocket = socket;
- mBufferedReader = new BufferedReader(new InputStreamReader(
- socket.getInputStream()));
- mStrMSG = "user: "+this.mSocket.getInetAddress()+" come total:"
- + mClientList.size();
- sendMessage();
- }
- public void run(){
- try{
- while((mStrMSG = mBufferedReader.readLine())!=null){
- if(mStrMSG.trim().equals("exit")){
- //当一个客户端退出时
- mClientList.remove(mSocket);
- mBufferedReader.close();
- mPrintWriter.close();
- mStrMSG = "user:" + this.mSocket.getInetAddress()
- + " exit total:" + mClientList.size();
- mSocket.close();
- sendMessage();
- break;
- }else{
- mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;
- sendMessage();
- }
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- //发送消息给所有客户端
- private void sendMessage() throws IOException {
- System.out.println(mStrMSG);
- for(Socket client : mClientList){
- mPrintWriter = new PrintWriter(client.getOutputStream(),true);
- mPrintWriter.println(mStrMSG);
- }
- }
- }
- }
客户端:
[java]- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /*
- * @topic:客户端
- */
- public class Client{
- private static final int PORT = 8889;
- private static ExecutorService exec = Executors.newCachedThreadPool();
- public static void main(String[] args) throws Exception{
- //System.out.println("Hello Landor!");
- new Client();
- }
- public Client(){
- try{
- Socket socket = new Socket("localhost",PORT);
- exec.execute(new Sender(socket));
- BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- String msg;
- while((msg = br.readLine())!=null){
- System.out.println(msg);
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- //客户端线程获取控制台输入消息
- static class Sender implements Runnable{
- private Socket socket;
- public Sender(Socket socket){
- this.socket = socket;
- }
- public void run(){
- try{
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
- while(true){
- String msg = br.readLine();
- pw.println(msg);
- if (msg.trim().equals("exit")) {
- pw.close();
- br.close();
- exec.shutdownNow();
- break;
- }
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
- }
评论暂时关闭