网络通信程序设计课程设计中文题目:mini QQ 2012局域网通信系统 英文题目:mini QQ 2012 LAN communication system姓 名: 林 泽 全班 级: 09网络工程学 号: 091402116完成时间: 2012年6月 指导老师: 肖东老师惠州学院 HUIZHOU UNIVERSITY摘要即时通信在广域网上飞速发展,由于越来越多的企业对于电子化办公的深入,即时通信系统对于局域网中的需求增多。
本文首先介绍了即时通信的开发背景、应用价值和意义等,然后对网络协议、多线程处理等即时通信的关键技术进行了分析和研究。
在此基础上实现了一个基于JAVA的局域网即时通信系统的基本模型。
此系统使用多线程处理来改进系统。
通过实验,在局域网环境下此系统运行良好,能实现即时通信的基本功能。
关键词:即时通信,局域网,多线程,网络协议AbstractInstant communication over the WAN rapid development, more and more enterprises in-depth for the electronic office, the increased demand for instant messaging system for LAN. This paper first introduces the development background of the instant communication, value and significance, then the key technologies of instant communication on the network protocol, multi-threaded processing, analysis and research. On this basis, the basic model of a LAN instant messaging system based on JAVA. This system uses multithreading to improve the system. Through experiments in the LAN environment, this system is running well, to achieve the basic functions of instant messaging.Keywords: instant messaging, LAN, multi-threaded, network protocol目录1. 引言 (4)1.1.开发背景与意义 (4)1.2.开发工具与语言简介 (4)2. 正文 (5)2.1. 需求分析 (5)2.1.1. 系统功能要求设计 (6)2.1.2. 系统的模块设计 (6)2.1.3. 系统的性能需求 (7)2.2. 总体设计 (8)2.2.1. 系统结构图 (8)2.2.2. 层次功能图 (8)2.2.3. 系统流程 (9)2.3. 详细设计 (9)2.4. 系统实现 (16)2.5. 调试、运行和维护 (18)2.5.1. 黑盒测试 (19)2.5.2. 白盒测试 (19)2.5.3. 调试 (19)3. 结束语 (20)参考文献 (21)评分表 (22)1.引言1.1.开发背景与意义随着互联网技术信息技术的迅猛发展以及计算机技术的广泛应用,即时通信IM(Instant Messaging)作为一种方便、高效、廉价的交流方式被广泛运用于局域网(LAN)乃至广域网(WAN)。
为人们的日常交流和资源共享以及传送信息和文件提供了方便、即时通信(IM)软件应运而生,且立即风靡全球。
现在我国流行的IM软件种类繁多,主要有国内腾讯公司的QQ,国外的有MSN、Skype、ICQ、AIM、X-lite、Yahoo Messenger等。
但在广域网的限制下主流即时通信软件服务器无法连接,这时开发局域网内的即时通信软件显得尤为重要。
本软件(mini QQ 2012)实现设计一个局域网即时通信软件,实现点对多、点对多即时通信,方便在局域网下的人们工作与交流。
1.2.开发工具与语言简介(1)JAVAJava 编程语言的风格十分接近C、C++语言。
Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心,Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。
在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。
它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。
不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
但在 J2SE 1.4.2 发布后,Java 的执行速度有了大幅提升。
与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。
全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。
“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。
这与微软公司所倡导的注重精英和封闭式的模式完全不同。
Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java 平台是基于 Java 语言的平台。
这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿 Java 的 C#语言。
(2)SwingSwing是一个用于开发Java应用程序用户界面的开发工具包。
它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。
Swing 开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。
工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event2.正文2.1.需求分析需求分析的过程可以说是一个对具体问题的反复理解和抽象的过程。
理解就是对现实问题的理解,要弄清楚究竟需要解决什么问题。
抽象就是出去问题的表面,提取问题的本质,建立问题的逻辑模型,以便于以后阶段的系统的设计实现。
需求分析阶段是软件产品生命周期中的一个重要阶段,其根本任务是确定用户对软件系统的需求。
所谓需求是指用户对软件的功能和性能的要求,就是用户希望软件能做什么事情,完成什么样的功能,达到什么性能。
通常需求分为两种类型:一种是功能性需求,一种是非功能性需求,这一点也需要有一种清楚的认识。
功能性需求是指需要计算机系统解决的问题,也就是对数据的处理要求,这是一类最主要的需求。
非功能性需求是指实际使用环境所要求的需求,往往是一些限制要求。
例如:性能要求,可靠性要求,安全保密要求,等等。
2.1.1.系统功能要求设计(1)服务器状态管理:主要实现管理员(mini QQ服务器端)开启聊天服务或关闭聊天服务(2)在线用户管理:主要实现管理员查看用户聊天内容是否违反相关规定(3)用户状态管理:主要实现管理员监视在线用户状态(4)发送系统消息:主要实现管理员向在线的所有用户或者某用户发送消息(5)登入登出聊天室:主要实现用户运行客户端,登入或登出聊天室(6)发送群聊信息:主要实现用户与聊天室所有人聊天(7)点对点私聊:主要实现用户选择某个人,进行私聊(8)发送聊天心情:主要实现用户在聊天过程中,发送聊天心情因此,细化后的需求规格说明表如下所示:2.1.2.系统的模块设计(1)服务器端模块(2)客户端模块2.1.3.系统的性能需求(1)硬件要求服务器端使用性能较好的服务器,客户端使用普通家庭的PC机。
(2)软件要求服务器端和客户端机器上都需要安装Windows 2000以上操作系统,JDK 1.6及以上版本。
2.2.总体设计在系统的需求分析阶段,我们已经知道系统“做什么”的问题了,现在我们要进入软件设计的阶段,去解决“怎么做”的问题。
在软件设计阶段,它分为总体设计和详细设计。
首先做总体设计,它是将软件的需求转化为数据结构和软件的系统结构。
然后是详细设计,即过程设计,通过对结构表示进行细化,得到软件的详细的数据结构和算法。
2.2.1.系统结构图基于以上的分析和研究,本文设计实现一个基于java的局域网通信系统。
该系统主要由客户端和服务器端两部分组成。
系统结构图如下图所示:2.2.2.层次功能图根据上面需求的分析,我们可以得到系统的层次功能图,结构如下所示:2.2.3.系统流程2.3.详细设计总体设计完成了软件系统的概要设计,规定了各个模块的功能以及模块之间的联系,进一步就要考虑实现各个模块规定的功能,这就是要进行详细设计。
在详细设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。
该系统采用多线程,基于Java平台。
同时,采用自己编写程序皮肤,开发出界面友好、舒服的交互界面。
同时添加了托盘功能、消息声音提示功能等附加功能。
(1)服务器端多线程接受用户连接请求的ServerAccessUserThread类public class ServerAccessUserThread extends Thread {/* 实例化SeverSocket对象*/ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserList userInfoList;/* 实例化用户对象 */User client;ServerReceiveThread recvThread;public boolean isStop;/* 构造函数,将相关控件传给ServerSocket线程 */public ServerAccessUserThread(ServerSocket server, JComboBox combobox, JTextArea textarea, JTextField textfield, UserList userInfoList) {this.server = server;bobox = combobox;this.textarea = textarea;this.textfield= textfield;erInfoList = userInfoList;isStop=false;}public void run() {while(!isStop&&!server.isClosed()) {/* 实例化用户节点 */client = new User();try {/* 实例化一个server */client.socket = server.accept();/* 获取用户的输入和输出显示到相应控件 */client.output = newObjectOutputStream(client.socket.getOutputStream());client.output.flush();client.input = newObjectInputStream(client.socket.getInputStream());ername = (String)client.input.readObject();combobox.addItem(ername);userInfoList.add(client);textarea.append("user【"+ername+"】上线"+"\n");textfield.setText("当前有"+userInfoList.getCount()+"人在线\n");/* 实例化消息接收线程,并将线程开启 */recvThread = newServerReceiveThread(textarea,textfield,combobox,client,userInfoList);recvThread.start();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}}(2)服务器端用户类Userpublic class User {String username=null;Socket socket=null;ObjectOutputStream output=null;ObjectInputStream input=null;User next=null;}(3)服务器端用户列表类UserListpublic class UserList {User root;User pointer;int count;public UserList() {root = new User();root.next = null;pointer = null;count = 0;}public void add(User n) {pointer = root;while(pointer.next!=null) {pointer = pointer.next;}pointer.next = n;n.next = null;count++;}public void del(User n) {pointer = root;while(pointer.next!=null) {if(pointer.next==n) {pointer.next = pointer.next.next;count--;break;}}}public int getCount() {return count;}public User find(String username) {if(count==0) {return null;}pointer = root;while(pointer.next!=null) {pointer = pointer.next;if(ername.equalsIgnoreCase(username)) { return pointer;}}return null;}public User find(int index) {if(count==0) {return null;}if(index<0) {return null;}pointer = root;int i = 0;while(i<index+1) {if(pointer.next!=null) {pointer=pointer.next;} else {return null;}i++;}return pointer;}}(4)客户端多线程类ClientReceiveThreadpublic class ClientReceiveThread extends Thread {private JComboBox combobox;private JTextArea textarea;Socket socket;ObjectOutputStream output;ObjectInputStream input;public ClientReceiveThread(Socket socket, ObjectOutputStream output, ObjectInputStream input, JComboBox combobox, JTextArea textarea) { this.socket = socket;this.output = output;this.input = input;bobox = combobox;this.textarea = textarea;}public void run() {while (!socket.isClosed()) {try {String type = (String) input.readObject();if (type.equalsIgnoreCase("系统信息")) {String sysmsg = (String) input.readObject();textarea.append("系统信息:" + sysmsg);} else if (type.equalsIgnoreCase("服务器关闭")) {output.close();input.close();socket.close();textarea.append("服务器已关闭!\n");break;} else if (type.equalsIgnoreCase("聊天信息")) {String message = (String) input.readObject();textarea.append(message);} else if (type.equalsIgnoreCase("用户列表")) {String userlist = (String) input.readObject();String[] usernames = userlist.split("\n");combobox.removeAllItems();int i = 0;combobox.addItem("所有人");while (i < usernames.length) {combobox.addItem(usernames[i]);i++;}combobox.setSelectedIndex(0);}} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}}(5)系统托盘功能实现方法SystemTrayInitial/* 添加托盘功能 */public void SystemTrayInitial() {if (!SystemTray.isSupported())// 判断当前系统是否支持系统栏return;try {String title = "miniQQ2012 Server"; // 系统栏标题String company = "Copyright by lowkey from network09"; // 系统栏内容SystemTray sysTray = SystemTray.getSystemTray();// 系统栏图标Image image = Toolkit.getDefaultToolkit().getImage("res/logo.png");TrayIcon trayicon = new TrayIcon(image, title + "\n" + company,createMenu());trayicon.setImageAutoSize(true);trayicon.addActionListener(new SysTrayActionListener());sysTray.add(trayicon);trayicon.displayMessage(title, company, );} catch (Exception e) {e.printStackTrace();}}(6)系统界面UI中自写容器类ImagePanelpublic class ImagePanel extends JPanel {private static final long serialVersionUID = -731012374666375667L;private Image img;/** 构造函数首先接受待绘制图像,并将其存入变量img以备后用。