Linux课程设计报告书模版.docx
《Linux课程设计报告书模版.docx》由会员分享,可在线阅读,更多相关《Linux课程设计报告书模版.docx(28页珍藏版)》请在冰豆网上搜索。
![Linux课程设计报告书模版.docx](https://file1.bdocx.com/fileroot1/2023-2/22/38ffd8c3-dd91-441d-bc7e-7b40eb2602f7/38ffd8c3-dd91-441d-bc7e-7b40eb2602f71.gif)
Linux课程设计报告书模版
Linux系统与程序设计
课程设计报告书
报告人:
目录:
1、实验项目目的2
2、实验项目的功能及模块划分2
3、实验项目的人员组成及指责划分2
4、设计与实现3
4.1系统结构3
4.2客户端界面3
4.2.1注册3
4.2.2登录4
4.2.3界面设计4
4.2.4查找好友4
4.3服务器的实现5
4.3.1用户登录5
4.3.2用户管理5
4.3.3转发聊天消息5
4.4文件操作6
4.5通信模块的实现6
4.5.1通信方式的选择6
5、测试与调试6
6、总结7
7、附录:
程序代码9
1、实验目的
在Linux下利用java编程实现类似于QQ的通信功能。
实现简单的qq功能:
注册、登陆、查找好友、聊天功能服务端还需实现配置文件设置、用户管理、日志显示的功能。
同时使用到相关的的文件操作以及java编程。
通过这次实验来锻炼在Linux下的编程能力,主要是熟悉Linux的编程环境,相关命令的操作、java软件的安装、以及对文件的操作,网络通讯等相关的方面东西。
2、实验项目的功能及模块划分
本实验是一个Linux下的网络即时通信工具,实现三人间的通讯。
这个项目总共分为五个模块客户端,服务器,通讯,文件操作以及文档维护与测试。
客户端的在分为登录、从服务器端获取在线人员并显示、选择联系人、向在线人员发送消息。
实时显示别人发给你的消息。
服务端主要是为客户端提供相关的信息服务,包括保存登录人员的IP信息、发送给客户端其他登录人员的IP、操作数据库等相关操作。
基本上完成了注册、登陆、聊天功能总体来说可以分为几下几个模块:
1)客户端与服务器的界面设计
2)客户端的通信部分
3)服务端的通信部分
4)文件操作
5)文档测试与维护
3、实验项目的人员组成及指责划分
xx:
组长,系统分析、整体设计和模块划分
xx:
通信模块设计和编码。
xx:
客户端以及服务器界面设计和编码。
xx:
文档维护和测试。
xx:
文件操作的设计和编码。
4、设计与实现
4.1系统结构
发送信息1
转发信息2
转发信息1
发送信息2
4.2客户端界面
4.2.1注册
4.2.2登录
4.2.3界面设计
4.2.4查找好友
4.3服务器的实现
4.3.1用户登录:
当客户端填写相关信息后,点击登录,将会通过UDP协议发送信息至服务器端,服务器端将保存客户端的端口信息到文件中。
4.3.2用户管理
4.3.3转发聊天消息
4.4文件操作:
通过对文件的操作实现了对用户的管理。
通过日志文件来记录客户端的信息。
4.5通信模块的实现
4.5.1通信方式的选择:
通信主要是通过UDP协议实现的。
服务器端保存客户端的地址信息。
客户端与其他客户端通信的时候先请求服务器该客户端的地址信息,让后利用返回的地址信息向该客户端发送信息。
信息不通过服务器端的转发。
5、测试与调试
(1)在用户注册时,当重复输入密码时不能显示错误,后经过改进后实现了这一功能,即提示用户前后输入的密码不同。
(2)当服务器关闭时,客户端会直接关闭。
经过改进后客户端会收到提醒,提醒客户与服务器连接有错。
6、总结
xx:
由于平时使用的都是window系统,所以linux系统接触不多虽然经过这学期对linux得系统学习,我对本次课程设计的目的和方法能够有些初步的理解,但在做的过程中却发现了很多问题,首先是linux系统的安装,就花费了我大量的时间。
因为考试临近,所以实验也没有做的很成功。
作为组长,对于这个实验的整体我把握的还不够好,对于模块的划分还有所欠缺。
我在这个实验中主要参与了系统分析、整体设计和模块划分,以及实验过程中部分代码的编写和统筹工作。
在实验中我们遇到了很多问题,如java的安装,环境变量的设置,等等。
在不断的尝试和错误中,懂得了如何去分析问题,解决问题,再设计程序的过程!
终于在大家的合作下,我们通过各种方法努力的去解决这些问题,当然大部分已经解决,有些问题依然没有解决。
但我还是有所收获。
xx:
在文件操作中有很多函数比如说fputs,fgets,因为对这些函数参数的格式顺序以及函数的用法上了解的不够深刻,所以在调试程序时经常会遇到这样那样的问题,后来把书自习看了一遍又在网上查阅的相关资料后才对这块内容能够做到得心应手。
还有就是在进程间通信方式的选择上我们用的是套接字通信方式,吸取了在做文件操作上的教训这次我提前把套接字的属性和用法做了详细的了解。
在这次课程设计中我主要做了文件操作与以及图形界面方面的一些建议等,在调试和修改程序时也和其他组员交流了意见和方法。
xx:
在做这个qq软件的时候还是有点吃力,但是在团队合作的精神下,我们还是顺利的完成了任务,本qq系统是在linux环境下用java编写出来的。
本人在做这个qq应用软件时,参与了客户端以及服务器界面设计和编码聊天部分代码的修改。
通过查找QQ图片来完成。
通过本次试验增加了我对linux系统的理解并且对linux系统的知识有了更多的掌握。
xx:
程序采用的是UDP协议的非连接通讯,在本地网络环境下能良好的工作,通常客户应用程序比服务器应用程序简单的多因为大多数客户端不必要明显处理并发并且不需要考虑其它异常,而服务器端则要复杂的多,需要考虑并发、执行效率、网络状况、客户状态和服务器崩溃等等诸多方面问题;linux系统下的多线程遵循POSIX线程接口,称为pthread。
编写linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
xx:
本人在做这个qq应用软件时,参与了调试和修改程序以及文档的编写。
在测试时,针对于用户的注册,登陆方面我考虑了很多细节,努力的查找漏洞并考虑其它异常。
在组长和队员的帮助下,同时上网查询信息,终于攻克了难关。
通过本次试验增加了我对测试的理解并且对linux系统的知识有了更多的掌握。
附录:
部分程序代码(包括:
客户端主程序类,登录,服务端主程序类,在线用户类)
客户端主程序类
packageclient;
importjava.awt.Font;
importjava.awt.FontFormatException;
importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.IOException;
importtools.SetFont;
importclient.frm.LoginPane;
publicclassJQClient{
publicstaticvoidmain(String[]args){
try{
Fontfont=Font.createFont(Font.TRUETYPE_FONT,newBufferedInputStream(JQClient.class.getResourceAsStream("/tools/simsun.ttc")));
font=font.deriveFont(Font.PLAIN,12);
SetFont.setFont(font);
}catch(FontFormatExceptione){
System.out.println("错误:
"+e.getMessage());
}catch(IOExceptione){
System.out.println("错误:
"+e.getMessage());
}
newLoginPane();
}
}
登录
packageclient.frm;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.FlowLayout;
importjava.awt.Graphics;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JCheckBox;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JPasswordField;
importjavax.swing.JTextField;
importjavax.swing.border.LineBorder;
importjavax.swing.border.TitledBorder;
importdata.UserState;
publicclassLoginPaneextendsJFrameimplementsActionListener{
privateJLabellblImg=newJLabel();
privateJLabellblJQNum=newJLabel("账号");
privateJComboBoxboxJQNum=newJComboBox();
privateJLabellblPassword=newJLabel("密码");
privateJPasswordFieldpfPassword=newJPasswordField();
privateJLabellblState=newJLabel("状态:
");
privateJComboBoxboxState=newJComboBox();
privateJButtonbtnRegister=newJButton("申请账号");
privateJButtonbtnSet=newJButton("设置↓");
privateJButtonbtnLogin=newJButton("登录");
privateJLabellblServerIP=newJLabel("服务器IP:
");
privateJTextFieldtxtServerIP=newJTextField("127.0.0.1");
privateJLabellblServerPort=newJLabel("端口:
");
privateJTextFieldtxtServerPort=newJTextField("3608");
privatebooleanisSet=false;
publicLoginPane(){
setTitle("用户登录");
setSize(324,235);
setResizable(false);
Toolkittk=Toolkit.getDefaultToolkit();
setLocation((tk.getScreenSize().width-getSize().width)/2,(tk.getScreenSize().height-getSize().height)/2);
setBackground(newColor(224,244,251));
init();
btnLogin.addActionListener(this);
btnRegister.addActionListener(this);
btnSet.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
privatevoidinit(){
lblImg.setPreferredSize(newDimension(325,47));
boxState.addItem(UserState.ONLINESTATE);
boxState.addItem(UserState.HIDDENSTATE);
boxState.addItem(UserState.DEPARTURESTATE);
boxState.addItem(UserState.BUSYSTATE);
boxState.setBackground(newColor(240,250,255));
boxState.setPreferredSize(newDimension(60,20));
boxAutoLogin.setBackground(newColor(240,250,255));
boxJQNum.setEditable(true);
boxJQNum.setPreferredSize(newDimension(140,20));
pfPassword.setPreferredSize(newDimension(140,20));
txtServerIP.setPreferredSize(newDimension(80,20));
txtServerPort.setPreferredSize(newDimension(50,20));
JPanelpane=newJPanel();
pane.setBackground(newColor(240,250,255));
pane.setBorder(newLineBorder(newColor(144,185,215)));
pane.setLayout(newFlowLayout(FlowLayout.CENTER,15,12));
pane.setPreferredSize(newDimension(300,110));
pane.add(newFillWidth(20,20,newColor(240,250,255)));
pane.add(lblJQNum);
pane.add(boxJQNum);
pane.add(newFillWidth(20,20,newColor(240,250,255)));
pane.add(newFillWidth(20,20,newColor(240,250,255)));
pane.add(lblPassword);
pane.add(pfPassword);
pane.add(newFillWidth(20,20,newColor(240,250,255)));
pane.add(lblState);
pane.add(boxState);
TitledBordertb=newTitledBorder(newLineBorder(Color.GRAY),"网络设置");
JPanelpaneSet=newJPanel();
paneSet.setPreferredSize(newDimension(300,60));
paneSet.setBorder(tb);
paneSet.add(lblServerIP);
paneSet.add(txtServerIP);
paneSet.add(newFillWidth(30,20));
paneSet.add(lblServerPort);
paneSet.add(txtServerPort);
setLayout(newFlowLayout(FlowLayout.CENTER,5,0));
add(lblImg);
add(newFillWidth(100,8));
add(pane);
add(newFillWidth(300,8));
add(btnRegister);
add(btnSet);
add(newFillWidth(65,20));
add(newFillWidth(300,8));
add(paneSet);
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==btnSet){
if(isSet){
isSet=false;
setSize(getWidth(),getHeight()-65);
btnSet.setText("设置↓");
}else{
isSet=true;
setSize(getWidth(),getHeight()+65);
btnSet.setText("设置↑");
}
}
if(e.getSource()==btnLogin){
dispose();
newMainPane(txtServerIP.getText(),Integer.parseInt(txtServerPort.getText()),Integer.parseInt(boxJQNum.getSelectedItem().toString()),newString(pfPassword.getPassword()),((UserState)boxState.getSelectedItem()).getState());
}
if(e.getSource()==btnRegister){
dispose();
newRegisterPane();
}
}
}
服务端主程序类
packageserver;
importjava.awt.Font;
importjava.awt.FontFormatException;
importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
import.URISyntaxException;
importdao.UserDAOByFile;
importserver.frm.Server;
importtools.JQCreater;
importtools.SetFont;
publicclassJQServer{
publicfinalstaticintmanager=10000;
publicstaticvoidmain(String[]args){
try{
Fontfont=Font.createFont(Font.TRUETYPE_FONT,newBufferedInputStream(JQServer.class.getResourceAsStream("/tools/simsun.ttc")));
font=font.deriveFont(Font.PLAIN,12);
SetFont.setFont(font);
}catch(FontFormatExceptione){
System.out.println("错误:
"+e.getMessage());
}catch(IOExceptione){
System.out.println("错误:
"+e.getMessage());
}
newServer();
newThread(){
publicvoidrun(){
try{
newUserDAOByFile().addSysUser(manager);
newJQCreater().saveIDJQ(1,manager);
}catch(IOExceptione){
System.out.println("错误:
"+e.getMessage());
}
}
}.start();
}
}
在线用户类
packageserver.frm.panes;
importjava.awt.BorderLayout;
importjava.awt.Dimension;
importjava.awt.FlowLayout;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowFocusListener;
importjava.util.Enumeration;
importjava.util.Vector;
importjavax.swing.JButton;
importjavax.swing.JComboBox;
importjavax.swing.JDialog;
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importjavax.swing.table.DefaultTableModel;
importjavax.swing.table.TableColumn;
importjavax.swing.table.TableRowSorter;
importserver.frm.Server;
importtools.DateDeal;
importdao.UserDAOByFile;
importdata.User;
importdata.UserSex;
importdata.UserState;
publicclassOnlinePaneextendsJPanelimplementsActionListener,Runnable{
/**查询JQ用户*/
privateJLabellblQuery=new