您的位置:首页 > 编程语言 > Java开发

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();
}
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息