基于android开发的聊天室 ChatRoom 1.0 :(二) 消息处理机制

本文介绍了基于socket通信的Android聊天室应用,通过消息中的标识行区分不同类型(如注册、登录、文字、语音)。服务器端使用线程处理请求,缓存在线用户信息,并通过集合遍历实现一对多消息广播。客户端同样通过读取标识行进行相应处理。完整代码可在优快云下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本应用是基于socket通信机制,在客户端和服务器端进行消息交互时都会在消息中添加一条标识行,用来标识消息的类型(注册、登录、退出、文字消息、语音消息),根据不同的消息类型分别做不同的数据处理,因为是一对多聊天,因此在服务器端缓存了所有在线用户信息,包括每个用户的头像数据,这里用了一个普通的xml文件来充当数据库保存用户的注册信息,下面列举了客户端和服务器端对消息处理的大致流程。

 

服务器端:服务器端开启后,一旦有个socket请求发过来,就会开启一个线程处理该请求。首先读取标识行,判断消息的类型,然后根据消息的类型做不同的处理。同时在服务器端用集合的方式缓存了所有开启的线程,因此对于需要一对多发送的消息会循环遍历该集合,从而保证所有在线客户端都能接收到消息。

public class ChatServer {
	private ExecutorService executorService;// 线程池
	private int port;// 监听端口
	private boolean quit = false;// 退出
	private ServerSocket server;
	private List<SocketTask> taskList = new ArrayList<SocketTask>();// 保存所有启动的socket集合

	public ChatServer(int port) {
		this.port = port;
		// 创建线程池,池中具有(cpu个数*50)条线程
		executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
				.availableProcessors() * 50);
	}

	/**
	 * 服务器终止,关闭所有线程
	 */
	public void quit() {
		this.quit = true;
		try {
			for (SocketTask tast : taskList) {
				tast.input.close();
			}
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 服务器启动
	 * 
	 * @throws Exception
	 */
	public void start() throws Exception {
		server = new ServerSocket(port);
		new Thread(new Runnable() {
			public void run() {
				while (!quit) {
					try {
						System.out.println("等待用户的socket请求");
						Socket socket = server.accept();
						// 为支持多用户并发访问,采用线程池管理每一个用户的连接请求
						SocketTask newTask = new SocketTask(socket);
						taskList.add(newTask);
						executorService.execute(newTask);
						System.out.println("启动一个线程开始处理socket请求");
					} catch (Exception e) {
						System.out.println("服务器终止!关闭所有线程");
					}
				}
			}
		}).start();
	}

	/**
	 * 内部线程类,负责与每个客户端的数据通信
	 * 
	 * @author Administrator
	 */
	private final class SocketTask implements Runnable {
		private Socket s;
		private DataInputStream in
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值