码迷,mamicode.com
首页 > 编程语言 > 详细

简易聊天程序教程(三)服务器的多线程

时间:2016-05-12 21:34:08      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

源代码下载链接:http://download.csdn.net/detail/sky453589103/9514686

如果有什么问题,欢迎留言。

如果一个服务器只能为两个用户提供服务器,那就真的是太渣了。很多时候,聊天的客户都会大于两个。因此需要提高并发量。

在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) {

			}

		}
	}

因为服务器应该是守护进程这样的,因此会一直循环。

简易聊天程序教程(三)服务器的多线程

标签:

原文地址:http://blog.csdn.net/sky453589103/article/details/51351995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!