Java简易聊天室
2011-11-15 20:21
204 查看
支持多人向服务器端发送消息并由服务器发送至各个客户端
服务器端代码:
客户端:
服务器端代码:
/* * @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); } } } }
客户端:
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(); } } } }
相关文章推荐
- 基于 Java 和 jQuery 的简易聊天室
- JAVA--简易聊天室程序
- Java基于socket实现简易聊天室实例
- Java简易聊天室程序socket
- 多线程Java简易聊天室
- java简易聊天室
- Java 简易C/S结构多线程聊天室 (阻塞式)
- java简易多用户聊天室
- 基于订阅/发布模式的简易聊天室实现(java+redis)
- java scoket (UDP通信模型)简易聊天室
- Java、WebSocket、HTML简易聊天室
- JAVA GUI PART1 记事本程序 极其简易版
- 号外:小雷将开发一款Java版的简易CMS系统
- 基于Linux c 用socket和线程 实现的简易聊天室之服务器
- java-socket多线程网络编程案列--搭建本地简易聊天对话服务器
- Java聊天室的UI代码,有点儿小问题
- PHP 基于文本系统的简易的聊天室
- 使用XML布局文件和java代码共同控制UI界面做一个简易图片浏览器
- java 聊天室
- java操作数据库的类——SqlHelper(简易版)