`
郑云飞
  • 浏览: 799713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java聊天室

阅读更多
package moreChat;
import java.io.*;
import java.net.Socket;
import java.util.concurrent.*;
public class ChatClient
{
	private static final int	   PORT = 8888;
	private static ExecutorService exec = Executors.newCachedThreadPool();
	public ChatClient()
	{
		try
		{
			Socket socket = new Socket("localhost", PORT);
			exec.execute(new Sender(socket));
			System.out.println("[" + socket.getInetAddress() + "]您好,欢迎来到郑云飞聊天室!");
			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);
				String msg;
				while(true)
				{
					msg = br.readLine();
					pw.println(msg);
					if (msg.trim().equals("bye"))
					{
						pw.close();
						br.close();
						exec.shutdownNow();
						break;
					}
				}
			} 
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) throws Exception
	{
		new ChatClient();
	}
}

 

package moreChat;
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;
public class ChatServer
{
	private static final int	PORT = 8888;				   // 端口号
	private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
	private ExecutorService	 exec;
	private ServerSocket		server;
	public ChatServer()
	{
		try
		{
			server = new ServerSocket(PORT);
			exec = Executors.newCachedThreadPool();
			System.out.println("服务器已启动!");
			Socket client = null;
			while (true)
			{
				client = server.accept(); // 接收客户连接
				list.add(client);
				exec.execute(new ChatTask(client));
			}
		} 
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	static class ChatTask implements Runnable
	{
		private Socket		 socket;
		private BufferedReader br;
		private PrintWriter	pw;
		private String		 msg;

		public ChatTask(Socket socket) throws IOException
		{
			this.socket = socket;
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			msg = "[" + this.socket.getInetAddress() + "]进入聊天室!当前聊天室有["+ list.size() + "]人";
			sendMessage();
		}
		public void run()
		{
			try
			{
				while ((msg = br.readLine()) != null)
				{
					if (msg.trim().equals("bye"))
					{
						list.remove(socket);
						br.close();
						pw.close();
						msg = "[" + socket.getInetAddress() + "]离开聊天室!当前聊天室有["+ list.size() + "]人";
						socket.close();
						sendMessage();
						break;
					} 
					else
					{
						msg = "[" + socket.getInetAddress() + "]说:" + msg;
						sendMessage();
					}
				}
			} 
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		/**
		 * 群发消息给聊天室的所有人
		 */
		private void sendMessage() throws IOException
		{
			System.out.println(msg);
			for (Socket client : list)
			{
				pw = new PrintWriter(client.getOutputStream(), true);
				pw.println(msg);
			}
		}
	}

	public static void main(String[] args)
	{
		new ChatServer();
	}

}

 

分享到:
评论
1 楼 any_bye 2011-12-01  

相关推荐

Global site tag (gtag.js) - Google Analytics