下面概要讲述一下我在设计完成服务器模块和设计客户端后台中遇到的问题及解决方案。
服务器:
1、服务器使用什么机制,是线程还是进程?
2、数据库如何设计能使服务器访问的效率提高?
3、如何处理大量用户同时访问服务器?
4、服务器与客户端之间选择何种心跳模型?
客户端:
1、客户端聊天到底使用什么模式,是C/S模型还是P2P?
2、客户端之间通信有何种模型?
3、。。。。?
4、。?
这里仅仅列举了很小一部分问题,但这些问题的解决与否在此项目中至关重要,直接决定做出来的课程设计是否高效,是否能经得起各种测试的考验,尤其是压力测试(对于服务器)。
那么下面我简单讲述一下我的解决方案:
1、服务器使用什么机制,是线程还是进程?
服务器中最重要的差不多就是线程活进程的使用,在并发处理大量用户的请求时,线程或进程发挥着不可替代的作用,在此项目中我选择了使用线程来完成服务器的设计,线程较进程有如下优点:
1)、它是一种非常"节俭"的多任务操作方式。操作系统启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能会有较大的区别;
2)、线程间方便的通信机制,由于同一进程下的线程之间共享数据空间(此处非常重要),所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
3)、使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;
4)、改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
鉴于以上四条线程的优点,我最终还是选择了用线程机制来完成服务器的设计。
2、数据库如何设计能使服务器访问的效率提高?
数据库的设计对于要访问数据库的用户请求非常重要,好的数据库设计方案往往能使服务器的效率几十倍甚至上百倍(实际数据测得),反之,差的数据库模式可能是服务器在应答大量用户请求时崩溃,或是客户端超时率增大很多,用户体验直接降到低谷,更谈何别人使用你的软件。所以对于数据库的设计,我把它放到了相当高的地位,其实说实话,后来的优化,数据库的改善是最提高服务器效率的最有效的方法。
早期的数据设计思路如下:
当用户申请帐号时,服务器选出能被申请的下一个帐号作为申请的帐号,将此帐号作为唯一标识给用户创建一个数据库,即每个人的数据(除了基本信息外)都用一个数据库来存储。
如下图
这种模式看似挺清晰,但这极大的降低了效率,这种设计方法在服务器在接收到用户请求需要访问数据库时,不通的用户就要进入不通的数据库,如果此时还需要该用户的一些基本信息,那么在数据库切换时耗时很长,在实际测试中用户申请失败的概率很大,用户的感受就不言而喻了,同样服务器的价值几乎全部丧失,此种设计方法很失败。
经过很长时间的思考,我想到了另外一种模型,即把用户群的基本信息放入到main数据库各表中,用户群其他的全部信息表放在users数据库中。
如下图:
在实际压力测试中,尤其是申请好友操作中此更改,显著提高了效率,比如原来同时申请100个帐号,最多只有28个申请成功,其他的均超时,而此番修改后,申请100个帐号,只需不到两秒,用户体验就显著提高了。
3、如何处理大量用户同时访问服务器?
这是最令人头疼的事情,作为服务器压力测试不过关,其他的都免谈。服务器是干什么的,当然就是为处理用户的请求的,请求的人数少的时候你怎么做都行,但大量用户同时发送请求时,可不是你想怎么做就怎么做了,对于这个问题,我提出了一些解决方案。
1、先保证服务器不崩溃,即保证内存、cpu等正常工作
保证此项不出问题,就得控制好多线程的开辟、启动、终止的 关系,此服务器用的机制是线程机制,即当服务器接收到用户的 请求时,服务器会开辟一个子线程,用来处理此请求,处理完请 求就终止线程。但问题出来了,当很多用户访问时,比如1000个,10000个甚至更多的时候,服务器会在很短的时间内开辟如此多的线程,请试想一下,服务器能不崩溃吗?肯定会崩溃,除非你是巨型机,呵呵。。。所以现在要解决这个问题,当我想到这个问题时,我很纠结啊,该怎么办呢?后来问了问魏老师,他提出的是在线程数量达到一定数量时,让请求排队,的确,虽然这样可能导致排队的请求超时,但毕竟服务器正常运行是重中之重,所以我根据魏老师的思路稍微修改了一下,从而达到了不让服务器崩溃的效果。
2、如何使用户快速得到一些经常访问的信息
这个看似不大重要的设计点却对服务器优化起着很重要的作用,比如说用户的密码、用户的ip和一些port,这些数据经常被用到,如果每次都去硬盘中的数据库中去读取的话,这样浪费在IO上的时间就会增加很多。所以,我提出的解决方案是将常用但占用内存较少的数据预读到数据库中,保证在IO上浪费的时间尽可能的少。
4、服务器与客户端之间选择何种心跳模型?
心跳对很多人来说是一个挺陌生的概念,但实际上心跳在很多地方得到应用,如并行运算工作组还有此次的即时聊天领域,它在这些领域发挥着不可替代的作用,通过心跳可以自动检测完成很多功能,比如此次项目的监测用户的状态改变与“假死”和“真死”等等,同时此模块也是系统运行中运作最频繁的一部分,因此处理好此模块将很的降低服务器的压力。
当今的心跳检测模型大约有以下几种:
1、推模型
2、拉模型
3、推拉混合式
此模式就是上述两种模式的有机组合,即正常情况下用推模型,客户端每隔一段时间便向服务器发送心跳包,告诉服务器客户端当前的状态;假如客户端由于断电、任务管理器强制关闭导致意外关闭时,客户端不能再想服务器发送心跳包,但遗憾的是客户端也无法发送自己下线的心跳报,此时服务器检测到客户端三次没有发过来心跳,于是服务器主动想客户端发送询问,来最终判断客户端是否在线,此模型充分发挥了推模型的省资源高效率、拉模型准确性高的优势,所以我最终选择了此模型。
早期的心跳模型设计和后期的心跳改进不大,改动了接收存储心跳的位置,即从硬盘转到了内存,但也大大降低了服务器的压力,毕竟心跳是服务器中最繁忙的部分,稍微一优化便可以产生很大的性能提升。
客户端:
1、客户端聊天到底使用什么模式,是C/S模型还是P2P?
这个问题在我刚开始做的时候和很多人一样认为,既然是C/S结构,聊天肯定经过服务器的中转发往另一个客户端。当少量的用户在线聊天是此模型的效率不是很差而且在网络不好时会发挥其优势,作为一个为公众做的软件,服务的群体毕竟不是一个两个,而是成千上万,我们都知道即时聊天工具最繁忙的无外乎就是聊天模块,问题来了,这么多人都通过服务器中转,服务器能承受的了吗?呵呵,我还是那句话,服务器得非常非常。。。强大。。。此时我想如何能降低服务器的压力呢,那答案就是客户端之间通过P2P的方式进行通信
2、客户端之间通信有何种模型?
这问题就真正涉及到聊天的具体环节了,怎么样才能做到软件工程要求模块的内聚性强、耦合度低呢?这里就要是功能模块独立化,这个思想正好用在了聊天的实现上,同时也是受TCP/IP分层协议的启发得出的模型。
这种模型保证了功能模块的独立化,非常清晰,各层之间功能独立,各自完成各自的工作。自我感觉这种聊天内部模型比较出色。
关于源码:http://blog.csdn.net/wangchangshuai0010/article/details/7343103
分享到:
相关推荐
在Java编程语言中实现QQ聊天软件的服务器和客户端,可以深入理解网络编程、多线程以及数据序列化等关键概念。 首先,让我们来探讨一下Java在服务器端的角色。Java服务器通常基于Socket编程来建立与客户端的连接。...
这个项目涵盖了服务器端和客户端的实现,让我们深入探讨其中涉及的关键知识点。 1. **Java编程语言**: Java是一种广泛使用的面向对象的编程语言,具有跨平台的特性,这使得Java成为开发服务器端和客户端应用的理想...
Java QQ 客户端与服务器项目是一个典型的网络通信应用,主要使用Java编程语言实现,用于构建类似QQ的即时通讯系统。这个项目可以帮助开发者深入理解网络编程、多线程、数据库操作以及用户界面设计等核心概念。 1. *...
在本项目中,"java实现的简易qq客户端+服务器端" 是一个基于Java编程语言构建的即时通讯系统,它模仿了QQ的基本功能,允许用户在局域网内进行聊天。这个系统由两个主要部分组成:客户端(ClientSetup.rar)和服务器及...
在本项目中,我们利用Java编程语言来实现一个简单的QQ聊天工具,涵盖了客户端与服务器的交互,以及基本的登录、多用户聊天和后台管理功能。这个项目对于学习Java网络编程和GUI设计非常有帮助,同时也提供了对并发...
在“服务器和客户端的坦克大战”项目中,我们探索的是如何使用Java编程语言构建一个基于局域网的多人在线坦克对战游戏。这个程序代码提供了一个基础框架,开发者可以通过学习和调整来创建一个功能完善的、视觉效果...
【Android 仿QQ客户端 服务器】项目是一个针对学习者设计的实战案例,旨在帮助开发者深入理解如何构建一个类似于QQ的即时通讯应用。这个项目涵盖了服务器端、客户端以及数据库的完整架构,为学习Android开发和服务器...
在这个Java实现中,我们利用了MAVEN作为项目管理工具和OLTU库来构建OAuth 2.0服务端和客户端。同时,数据加密采用了MD5算法,以增强安全性。 首先,OAuth 2.0的核心概念包括四个角色:资源所有者(Resource Owner)...
本项目是基于Java技术实现的一个高仿QQ聊天界面,包括服务端(QQServer)和客户端(QQClient)两部分。该项目旨在为学习Java编程和网络通信的开发者提供一个实战参考,通过此项目,可以深入理解Java图形用户界面...
Java QQ小程序是一个基于Socket编程和Swing图形用户界面(GUI)技术实现的简易即时通讯应用。这个项目由两个主要部分组成:服务端和客户端。在深入解析这些知识点之前,我们先了解一下Socket编程和Swing的基本概念。...
在Java通信项目中,客户端UI实现以及交互是构建应用程序的关键部分,尤其是对于类QQ聊天软件这样的实时通讯平台。本文将深入探讨如何使用Java技术来设计和实现用户界面,并确保其与后端通信的有效交互。 首先,我们...
在给定的项目中,"client"包可能包含了C++客户端的源代码,实现了与Java NIO服务器的通信。而"sensor"包可能是Java NIO的一部分,专门负责接收来自客户端的消息,并进行处理和转发。由于没有提供具体的源代码,我们...
在本项目中,我们探讨的是使用Java语言开发的QQ客户端和服务端。这是一份非常有价值的教育资源,适合于学习Java编程的学生以及对网络通信感兴趣的开发者。它涵盖了从基础的Socket编程到复杂的多线程处理,以及可能...
1. **Socket编程**:Java的java.net.Socket和ServerSocket类用于建立客户端和服务器之间的连接,实现数据的双向传输。 2. **多线程**:服务器通常需要同时处理多个客户端的请求,因此会用到多线程技术,每个客户端...
【Java编程语言基础】 ...通过韩顺平老师的Java课程和QQ项目实践,学生不仅能系统地学习Java编程语言,还能将理论知识应用于实际项目,提升解决实际问题的能力。这样的学习过程对于成为一名合格的Java开发者至关重要。
【Java山寨版QQ项目】是韩顺平老师为了教学目的设计的一个模拟QQ功能的应用程序,旨在帮助初学者理解和掌握Java编程语言以及相关的软件开发技术。这个项目提供了从基础到进阶的Java编程实践,涵盖了网络通信、多线程...
ip是写死的 客户端需要获取本地ip地址才能连接 运行-cmd-ipconfig 就可以看到本机ip了 之后再客户端MainActivity的ip参数更改成本机ip就行 新手有些地方写的不好可以留言或者加我的qq告诉我哦
综上所述,这个项目涵盖了客户端编程、服务器端编程以及两者之间的交互,是学习和理解Java网络编程、Servlet技术以及UI设计的宝贵实践案例。通过深入研究和分析,开发者可以进一步提升自己的技能,并应用于更复杂的...
在Java端,我们使用`java.net.Socket`和`ServerSocket`类来实现客户端和服务器端的Socket通信。客户端创建Socket实例,指定服务器的IP和端口,然后通过Socket的`getOutputStream()`和`getInputStream()`方法获取数据...
QQ服务器端.rar QQ客户端.rar 改进QQ客户机服务器视频实现.rar Q第三方库.rar 这个java版山寨QQ项目实现的功能有: 1.实现的java视频聊天; 2.集成了Mina框架; 3.服务器管理模块通过XStream配置成插件模式. 4....