Android编程实战——仿微信群聊-1——服务器端实现
学习Android过程中,为了更有组织化的学习就造了个轮子练练手。
项目源代码移步github
首先就是服务端和客户端的实现了。
服务器和客户端的网络传输使用Java Socket写的。
对Java Socket还没有了解的可以看看这里——Java Socket 基础编程
先要有一个实现思路,在这里服务器端有三个主要的类,Server类,ServerThread类,ClientThread类。
作用分别是,Server类可以启动一个服务器线程ServerThread来监听端口,然后每有一个客户端连接上该端口,就启动一个客户端线程ClientThread。
代码:
Server类:
public class Server {
private ServerSocket serverSocket = null;
private ServerThread serverThread = null; //服务器线程,负责监听某个端口与客户端通信,(自写类)
private final int PORT = 4243; //服务器监听端口
//构造方法
public Server() {
}
//启动一个服务器线程
public void runServer() {
if (serverSocket == null) {
try {
//监听端口PORT
serverSocket = new ServerSocket(PORT);
//启动服务器线程
serverThread = new ServerThread(serverSocket);
serverThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] arg) {
Server server = new Server();
server.runServer();
}
}
在这里我用LinkedBlockingQueue实现消息队列,每个服务器线程有一个接收消息的队列,每个客户端线程有一个发送消息的队列。客户端线程将收到的消息放入服务器线程的接收消息队列中,服务器取出消息按照情况分发到各个客户端线程的发送消息队列中,然后再由客户端线程发送消息。
ServerThread类:
public class ServerThread extends Thread {
private ServerSocket serverSocket = null;
private LinkedBlockingQueue<MyMessage> msgQueue = null; //服务器的消息队列
private List<String> hostAddress = null; //记录客户端的ip地址与客户端消息队列相对应
private List<LinkedBlockingQueue<MyMessage>> sendQueues = null;