如果一个服务器只能为两个用户提供服务器,那就真的是太渣了。很多时候,聊天的客户都会大于两个。因此需要提高并发量。
在Java中使用多线程还是很方便的。我在这个服务器程序使用的是实现Runnable接口的方法来定义自己的多线程操作。通过重写run方法,来实现自己的多线程操作。
每个线程都会有一个client成员变量,这个成员变量用来记录客户端的Socket。然后,每个线程都会使用同一个服务器。
服务器的多线程,基于下面一种思想,如果有一个新的客户登陆,为这个客户新建一个线程,这个线程会以阻塞的方式来监听来自客户的信息。一旦获取到信息,就使用RequestMessage类来解析信息。然后根据信息的不同,执行server中的对应的接口。如下图:
显然,服务器资源是临界资源,因此需要对临界资源的使用加上互斥条件。使用synchronized关键字可以很方便的满足我们的需求。
简单的介绍一下这个关键字:
当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。通俗的说,就是用synchronized来上锁。
需要注意的是,在Server的接口中LogOut接口的返回值一直null,如果response为null的时候,这个线程不会向客户发送任何东西。
在SimpleChatServer中,会阻塞的调用accept函数来监听是否有新的连接建立,如果有就为这个连接创建一个ServerThread类,来执行相应的任务。创建为每个连接创建一个线程的动作在startn函数中,这个函数的意义是启动的意思。一旦启动这个服务器,上述的动作就会被执行。
public void startn() {
while (true) {
try {
Socket s = serverSocket.accept();
Thread t = new Thread(new ServerThread(s, this));
t.start();
} catch (IOException e) {
}
}
}
因为服务器应该是守护进程这样的,因此会一直循环。