linux课程设计报告书模版.doc

上传人:精*** 文档编号:865405 上传时间:2023-10-05 格式:DOC 页数:22 大小:276.69KB
下载 相关 举报
linux课程设计报告书模版.doc_第1页
第1页 / 共22页
linux课程设计报告书模版.doc_第2页
第2页 / 共22页
linux课程设计报告书模版.doc_第3页
第3页 / 共22页
linux课程设计报告书模版.doc_第4页
第4页 / 共22页
linux课程设计报告书模版.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、目录:1、实验项目目的22、实验项目的功能及模块划分23、实验项目的人员组成及指责划分24、设计与实现341 系统结构342 客户端界面3421 注册3422 登录4423 界面设计4424 查找好友443服务器的实现5431 用户登录5432 用户管理5433 转发聊天消息544 文件操作645 通信模块的实现6451 通信方式的选择65、测试与调试66、总结77、附录:程序代码91、实验目的 在Linux下利用java编程实现类似于QQ的通信功能。实现简单的qq功能:注册、登陆、查找好友、聊天功能服务端还需实现配置文件设置、用户管理、日志显示的功能。同时使用到相关的的文件操作以及java编

2、程。通过这次实验来锻炼在Linux下的编程能力,主要是熟悉Linux的编程环境,相关命令的操作、java软件的安装、以及对文件的操作,网络通讯等相关的方面东西。2、实验项目的功能及模块划分本实验是一个Linux下的网络即时通信工具,实现三人间的通讯。这个项目总共分为五个模块客户端,服务器,通讯,文件操作以及文档维护与测试。客户端的在分为登录、从服务器端获取在线人员并显示、选择联系人、向在线人员发送消息。实时显示别人发给你的消息。 服务端主要是为客户端提供相关的信息服务,包括保存登录人员的IP信息、发送给客户端其他登录人员的IP、操作数据库等相关操作。基本上完成了注册、登陆、聊天功能总体来说可以

3、分为几下几个模块: 1)客户端与服务器的界面设计 2)客户端的通信部分 3)服务端的通信部分 4)文件操作 5)文档测试与维护3、实验项目的人员组成及指责划分 xx:组长,系统分析、整体设计和模块划分 xx:通信模块设计和编码。 xx:客户端以及服务器界面设计和编码。 xx:文档维护和测试。 xx:文件操作的设计和编码。4、设计与实现 41 系统结构 客户端1 服务器端 界面 通信 客户端2发送信息1 转发信息2 转发信息1 界面 通信发送信息242 客户端界面421 注册422 登录423 界面设计4. 2. 4 查找好友43服务器的实现431 用户登录: 当客户端填写相关信息后,点击登录,

4、将会通过UDP协议发送信息至服务器端,服务器端将保存客户端的端口信息到文件中。432 用户管理433 转发聊天消息44 文件操作 :通过对文件的操作实现了对用户的管理。通过日志文件来记录客户端的信息。45 通信模块的实现 4.5.1通信方式的选择 :通信主要是通过UDP 协议实现的。服务器端保存客户端的地址信息。客户端与其他客户端通信的时候先请求服务器该客户端的地址信息,让后利用返回的地址信息向该客户端发送信息。信息不通过服务器端的转发。5、测试与调试(1)在用户注册时,当重复输入密码时不能显示错误,后经过改进后实现了这一功能,即提示用户前后输入的密码不同。(2) 当服务器关闭时,客户端会直接

5、关闭。经过改进后客户端会收到提醒,提醒客户与服务器连接有错。6、总结xx:由于平时使用的都是window系统,所以linux系统接触不多虽然经过这学期对linux得系统学习,我对本次课程设计的目的和方法能够有些初步的理解,但在做的过程中却发现了很多问题,首先是linux系统的安装,就花费了我大量的时间。因为考试临近,所以实验也没有做的很成功。作为组长,对于这个实验的整体我把握的还不够好,对于模块的划分还有所欠缺。我在这个实验中主要参与了系统分析、整体设计和模块划分,以及实验过程中部分代码的编写和统筹工作。在实验中我们遇到了很多问题,如java的安装,环境变量的设置,等等。在不断的尝试和错误中,

6、懂得了如何去分析问题,解决问题,再设计程序的过程!终于在大家的合作下,我们通过各种方法努力的去解决这些问题,当然大部分已经解决,有些问题依然没有解决。但我还是有所收获。xx:在文件操作中有很多函数比如说fputs,fgets,因为对这些函数参数的格式顺序以及函数的用法上了解的不够深刻,所以在调试程序时经常会遇到这样那样的问题,后来把书自习看了一遍又在网上查阅的相关资料后才对这块内容能够做到得心应手。还有就是在进程间通信方式的选择上我们用的是套接字通信方式,吸取了在做文件操作上的教训这次我提前把套接字的属性和用法做了详细的了解。在这次课程设计中我主要做了文件操作与以及图形界面方面的一些建议等,在

7、调试和修改程序时也和其他组员交流了意见和方法。xx:在做这个qq软件的时候还是有点吃力,但是在团队合作的精神下,我们还是顺利的完成了任务,本qq系统是在linux环境下用java编写出来的。 本人在做这个qq应用软件时,参与了客户端以及服务器界面设计和编码聊天部分代码的修改。通过查找QQ图片来完成。通过本次试验增加了我对linux系统的理解并且对linux系统的知识有了更多的掌握。xx:程序采用的是UDP协议的非连接通讯,在本地网络环境下能良好的工作,通常客户应用程序比服务器应用程序简单的多因为大多数客户端不必要明显处理并发并且不需要考虑其它异常,而服务器端则要复杂的多,需要考虑并发、执行效率

8、、网络状况、客户状态和服务器崩溃等等诸多方面问题;linux系统下的多线程遵循POSIX线程接口,称为pthread。编写linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。xx:本人在做这个qq应用软件时,参与了调试和修改程序以及文档的编写。在测试时,针对于用户的注册,登陆方面我考虑了很多细节,努力的查找漏洞并考虑其它异常。在组长和队员的帮助下,同时上网查询信息,终于攻克了难关。通过本次试验增加了我对测试的理解并且对linux系统的知识有了更多的掌握。附录:部分程序代码(包括:客户端主程序类,登录,服务端主程序类,在线用户类)客户端主程序类p

9、ackage client;import java.awt.Font;import java.awt.FontFormatException;import java.io.BufferedInputStream;import java.io.File;import java.io.IOException;import tools.SetFont;import client.frm.LoginPane;public class JQClient public static void main(String args) try Font font = Font.createFont(Font.TR

10、UETYPE_FONT, new BufferedInputStream(JQClient.class.getResourceAsStream(/tools/simsun.ttc);font = font.deriveFont(Font.PLAIN, 12);SetFont.setFont(font); catch (FontFormatException e) System.out.println(错误:+e.getMessage(); catch (IOException e) System.out.println(错误:+e.getMessage();new LoginPane();登录

11、package client.frm;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;i

12、mport javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;import javax.swing.border.LineBorder;import javax.swing.border.TitledBorder;import data.UserState;public class LoginPane extends J

13、Frame implements ActionListenerprivate JLabel lblImg = new JLabel();private JLabel lblJQNum = new JLabel(账号);private JComboBox boxJQNum = new JComboBox();private JLabel lblPassword = new JLabel(密码);private JPasswordField pfPassword = new JPasswordField();private JLabel lblState = new JLabel(状态:);pri

14、vate JComboBox boxState = new JComboBox();private JButton btnRegister = new JButton(申请账号);private JButton btnSet = new JButton(设置);private JButton btnLogin = new JButton(登录);private JLabel lblServerIP = new JLabel(服务器IP:);private JTextField txtServerIP = new JTextField(127.0.0.1);private JLabel lblS

15、erverPort = new JLabel(端口:);private JTextField txtServerPort = new JTextField(3608);private boolean isSet = false;public LoginPane() setTitle(用户登录);setSize(324,235);setResizable(false);Toolkit tk=Toolkit.getDefaultToolkit();setLocation(tk.getScreenSize().width-getSize().width)/2,(tk.getScreenSize().

16、height-getSize().height)/2);setBackground(new Color(224,244,251);init();btnLogin.addActionListener(this);btnRegister.addActionListener(this);btnSet.addActionListener(this);setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);private void init()lblImg.setPreferredSize(new Dimension(325,47);boxSta

17、te.addItem(UserState.ONLINESTATE);boxState.addItem(UserState.HIDDENSTATE);boxState.addItem(UserState.DEPARTURESTATE);boxState.addItem(UserState.BUSYSTATE);boxState.setBackground(new Color(240,250,255);boxState.setPreferredSize(new Dimension(60,20);boxAutoLogin.setBackground(new Color(240,250,255);bo

18、xJQNum.setEditable(true);boxJQNum.setPreferredSize(new Dimension(140,20);pfPassword.setPreferredSize(new Dimension(140,20);txtServerIP.setPreferredSize(new Dimension(80,20);txtServerPort.setPreferredSize(new Dimension(50,20);JPanel pane = new JPanel();pane.setBackground(new Color(240,250,255);pane.s

19、etBorder(new LineBorder(new Color(144,185,215);pane.setLayout(new FlowLayout(FlowLayout.CENTER,15,12);pane.setPreferredSize(new Dimension(300,110);pane.add(new FillWidth(20,20,new Color(240,250,255);pane.add(lblJQNum);pane.add(boxJQNum);pane.add(new FillWidth(20,20,new Color(240,250,255);pane.add(ne

20、w FillWidth(20,20,new Color(240,250,255);pane.add(lblPassword);pane.add(pfPassword);pane.add(new FillWidth(20,20,new Color(240,250,255);pane.add(lblState);pane.add(boxState);TitledBorder tb = new TitledBorder(new LineBorder(Color.GRAY),网络设置);JPanel paneSet = new JPanel();paneSet.setPreferredSize(new

21、 Dimension(300,60);paneSet.setBorder(tb);paneSet.add(lblServerIP);paneSet.add(txtServerIP);paneSet.add(new FillWidth(30,20);paneSet.add(lblServerPort);paneSet.add(txtServerPort);setLayout(new FlowLayout(FlowLayout.CENTER,5,0);add(lblImg);add(new FillWidth(100,8);add(pane);add(new FillWidth(300,8);ad

22、d(btnRegister);add(btnSet);add(new FillWidth(65,20);add(new FillWidth(300,8);add(paneSet);public void actionPerformed(ActionEvent e) if(e.getSource()=btnSet)if(isSet)isSet = false;setSize(getWidth(),getHeight()-65);btnSet.setText(设置);elseisSet = true;setSize(getWidth(),getHeight()+65);btnSet.setText

23、(设置);if(e.getSource()=btnLogin)dispose();new MainPane(txtServerIP.getText(),Integer.parseInt(txtServerPort.getText(),Integer.parseInt(boxJQNum.getSelectedItem().toString(),new String(pfPassword.getPassword(),(UserState)boxState.getSelectedItem().getState();if(e.getSource()=btnRegister)dispose();new

24、RegisterPane();服务端主程序类package server;import java.awt.Font;import java.awt.FontFormatException;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import .URISyntaxException;import dao.UserDAOByFile;import server.frm.Server;import tools.JQC

25、reater;import tools.SetFont;public class JQServer public final static int manager = 10000;public static void main(String args) try Font font = Font.createFont(Font.TRUETYPE_FONT,new BufferedInputStream(JQServer.class.getResourceAsStream(/tools/simsun.ttc);font = font.deriveFont(Font.PLAIN, 12);SetFo

26、nt.setFont(font); catch (FontFormatException e) System.out.println(错误:+e.getMessage(); catch (IOException e) System.out.println(错误:+e.getMessage(); new Server();new Thread()public void run() try new UserDAOByFile().addSysUser(manager);new JQCreater().saveIDJQ(1, manager); catch (IOException e) Syste

27、m.out.println(错误:+e.getMessage();.start();在线用户类package server.frm.panes;import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.e

28、vent.WindowFocusListener;import java.util.Enumeration;import java.util.Vector;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JDialog;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable

29、;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;import javax.swing.table.TableRowSorter;import server.frm.Server;import tools.DateDeal;import dao.UserDAOByFile;import data.User;import data.UserSex;import data

30、.UserState;public class OnlinePane extends JPanel implements ActionListener,Runnable/* 查询JQ用户 */private JLabel lblQuery = new JLabel(查询JQ用户);/* 输入的查询的关键字 */private JTextField txtQuery = new JTextField();/* 查询的类型 */private JComboBox boxQuery = new JComboBox();/* 查询 */private JButton btnQuery = new JB

31、utton(查询);/* 添加新用户 */private JButton btnBroadCast = new JButton(广播系统消息);/* 刷新重新获得所有用户 */private JButton btnFlash = new JButton(刷新);/* 显示用户的表格 */private JTable table = null; /= new JTable();/* 表格的模型 */private DefaultTableModel model = null;/* 状态栏 */private JLabel lblInfo = new JLabel(共有用户:0位);private

32、 BroadcastWindow broadcastWindow = null;public OnlinePane() btnBroadCast.addActionListener(this);btnFlash.addActionListener(this);btnQuery.addActionListener(this);init();private void init()txtQuery.setPreferredSize(new Dimension(100,25);boxQuery.addItem(new QueryWay(按号查询,0);model = new MyDefaultTabl

33、eModel();model.addColumn(ID);model.addColumn(号);model.addColumn(昵称);model.addColumn(状态);model.addColumn(注册时间);table = new JTable(model);TableRowSorter sorter = new TableRowSorter(model); table.setRowSorter(sorter);TableColumn tcID = table.getColumn(model.getColumnName(0);tcID.setPreferredWidth(25);t

34、cID.setMaxWidth(25);tcID.setMinWidth(25);TableColumn tcJQ = table.getColumn(model.getColumnName(1);tcJQ.setPreferredWidth(70);tcJQ.setMaxWidth(80);tcJQ.setMinWidth(60);TableColumn tcNick = table.getColumn(model.getColumnName(2);tcNick.setPreferredWidth(70);tcNick.setMaxWidth(80);tcNick.setMinWidth(6

35、0);TableColumn tcState = table.getColumn(model.getColumnName(7);tcState.setPreferredWidth(30);tcState.setMaxWidth(30);tcState.setMinWidth(30);JPanel paneNorth = new JPanel();paneNorth.setLayout(new FlowLayout(FlowLayout.CENTER,5,5);paneNorth.add(lblQuery);paneNorth.add(txtQuery);paneNorth.add(boxQue

36、ry);paneNorth.add(btnQuery);paneNorth.add(btnFlash);paneNorth.add(btnBroadCast);JPanel paneSouth = new JPanel();paneSouth.add(lblInfo);setLayout(new BorderLayout();add(paneNorth,BorderLayout.NORTH);add(new JScrollPane(table),BorderLayout.CENTER);add(new FillWidth(5,5),BorderLayout.WEST);add(new Fill

37、Width(5,5),BorderLayout.EAST);add(paneSouth,BorderLayout.SOUTH);public void actionPerformed(ActionEvent e) if(e.getSource()=btnBroadCast)if(broadcastWindow=null)broadcastWindow = new BroadcastWindow();elsebroadcastWindow.setVisible(true);if(e.getSource()=btnFlash)flushOnlineUser();if(e.getSource()=b

38、tnQuery)QueryOnlineUser(txtQuery.getText(),(QueryWay)boxQuery.getSelectedItem().getWay();private class QueryWayprivate String name;private int way;public QueryWay(String name,int way) this.name = name;this.way = way;public String toString() return this.name;public int getWay() return way;public void

39、 run() btnFlash.setEnabled(false);if(Server.isFileWay)table.setAutoCreateRowSorter(false);model.setRowCount(0);int totalNum = 0;int onlineNum = 0;int hiddenNum = 0;int departureNum = 0;int busyNum = 0;if(ServicePane.table!=null & !ServicePane.table.isEmpty()totalNum = ServicePane.table.size();Enumer

40、ation onlineUser = ServicePane.table.keys();UserDAOByFile userDAO = new UserDAOByFile();while(onlineUser.hasMoreElements()Integer jqnum = onlineUser.nextElement();User user = userDAO.findById(jqnum);if(user!=null)if(user.getState()=UserState.ONLINESTATE.getState()onlineNum+;if(user.getState()=UserSt

41、ate.DEPARTURESTATE.getState()departureNum+;if(user.getState()=UserState.BUSYSTATE.getState()busyNum+;if(user.getState()=UserState.HIDDENSTATE.getState()hiddenNum+;addUserToTable(user);table.setAutoCreateRowSorter(true);lblInfo.setText(共有JQ用户:+totalNum+位.其中, +在线用户:+onlineNum+位. +隐身用户:+hiddenNum+位. +离

42、开用户:+departureNum+位. +繁忙用户:+busyNum+位.);elselblInfo.setText(注意:系统暂不支持数据库方式!请使用文件方式保存数据!);btnFlash.setEnabled(true);public void flushOnlineUser()new Thread(this).start();private void QueryOnlineUser(String query,int type)if(query.equals()return;UserDAOByFile userDAO = new UserDAOByFile();model.setRowCount(0);if(type=0)try int jqnum = Integer.parseInt(query);if(ServicePane.table.containsKey(jqnum)User user = userDAO.findById(jqnum);if(user!=null)addUserToTable(user); catch (NumberFormatException e) JOptionPane.showMessageDialog(null, 请确保输入的正确的JQ号码!);return;return;private void addU

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 课程设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922