Android高手进阶(五)之Android聊天室(3)

上面开发了启动与关闭服务器端线程程序,下面我们继续开发服务端程序。其实剩下的两个线程CilentThread与BroadCast很好理解,前者就是从客户端读取信息;后者就是服务端想客户端定时发送信息。只要把这两点看懂了,程序就不能。好了,我就直接上代码了:

1、ClientThread.java代码如下:

package com.wyf.wpf;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ClientThread extends Thread {
	// 声明客户端socket
	Socket clientSocket;
	// 声明客户端数据输出与输入流
	DataInputStream in = null;
	DataOutputStream out = null;
	// 服务端线程
	ServerThread serverThread;

	// 构造函数,初始化相关变量
	public ClientThread(Socket socket, ServerThread serverThread) {
		this.clientSocket = socket;
		this.serverThread = serverThread;
		try {
			in = new DataInputStream(clientSocket.getInputStream());
			out = new DataOutputStream(clientSocket.getOutputStream());
		} catch (IOException e2) {
			System.out.println("发生异常" + e2);
			System.out.println("建立I/O通道失败!");
			System.exit(3);
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		while (true) {
			try {
				// 读取客户端输入数据
				String message = in.readUTF();
				synchronized (serverThread.messages) {
					if (message != null) {
						// 添加数据到服务端显示
						serverThread.messages.addElement(message);
						Sever.jTextArea.append(message + '\n');
					}
				}
			} catch (IOException E) {
				break;
			}
		}
	}

}

讲解:

       当该类的构造方法被调用时,获得了Socket得输入与输出流,向客户端发送数据或接受客户端数据。Run()方法监听Socket是否有新消息,如果有新消息,则加入messages数组中。

2、编写BroadCast.java,代码如下:

package com.wyf.wpf;

import java.io.IOException;

public class BroadCast extends Thread {
	// 声明服务、客户端线程
	ClientThread clientThread;
	ServerThread serverThread;
	// 字符串
	String str;

	// 构造函数
	public BroadCast(ServerThread serverThread) {
		this.serverThread = serverThread;
	}

	// 运行
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		while (true) {
			try {
				Thread.sleep(200);
			} catch (InterruptedException E) {
			}
			synchronized (serverThread.messages) {
				if (serverThread.messages.isEmpty()) {
					continue;
				}
				// 取得消息
				str = (String) this.serverThread.messages.firstElement();
			}
			// 同步发送消息到各个客户端
			synchronized (serverThread.clients) {
				for (int i = 0; i < serverThread.clients.size(); i++) {
					// 取得各个客户端
					clientThread = (ClientThread) serverThread.clients
							.elementAt(i);
					try {
						// 客户端中写入数据
						clientThread.out.writeUTF(str);
					} catch (IOException E) {
					}
				}
				this.serverThread.messages.removeElement(str);
			}
		}
	}

}

讲解:

       该类的run()方法每隔200ms执行一次,向所有客户端发送messages数组中尚未发送出得消息。

好了服务端程序就到此开发完毕了。我们的Android聊天室也告一段落了。下面要开发的就是手机客户端。敬请期待,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值