计算机网络聊天室课程设计.docx
- 文档编号:23972633
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:19
- 大小:1.18MB
计算机网络聊天室课程设计.docx
《计算机网络聊天室课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络聊天室课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
计算机网络聊天室课程设计
《计算机网络》课程
设计报告
设计题目:
聊天室
同组人姓名:
王巍瑾
马志超
周旭
同组人学号:
20151515105
20151515104
20151515138
专业班级:
计科153
指导教师:
金松林
日期:
2017年6月12日—16日
一、题目意义和需求分析
1.题目意义
即时通讯或在线聊天是目前Internet上最为流行的通讯方式,用户之间通过文字传输信息。
这是一种可以让使用者在网络上建立私人聊天室的实时通讯服务。
除了简单的文字信息,使用者之间还可以互相发送文件、文档、音乐、视频等文件。
只要与服务器链接,无论对方在天涯海角,双方隔得多远都没有问题。
消息的实时更新,拉近了我们相知的桥梁,文件的相互传输,使同事之间办公更方便快捷。
2.需求分析
a.注册
当选择注册时,创建一个File文件类,载入“user.txt”,判断用户名是否已经存在,用户名有效后写入“user.txt”。
b.登录
去“user.txt”读取用户数据,验证用户名是否存在,验证用户密码是否正确,如果以上验证全部正确,返回客户端信息,提示登陆成功进入聊天界面。
c.聊天
所有已登录的用户的名称都会在列表中显示,然后就可以选择其中一个或多个发起聊天。
接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提取消息类型,再根据类型将消息转化后通过Socket转发到相应的用户。
d.文件传输
在聊天的基础上增加了一个文件传输功能。
同事之间办公难免有一些资料的来往,在登录列表中选择一个用户或多个用户发送文件,等对方确认接收后即可建立连接进行文件传输。
二、设计说明
聊天室总体分为三个模块,主要包括注册登录,聊天模块,文件传输模块。
系统运行在java环境中,要求java环境为JDK1.8+;
设计中的重点是通过Java中的ServerSocket搭建TCP服务器,通过在客户端创建Socket套接字连接服务器,然后通过ObjectOutputStream来发送Message(数据消息的封装类)对象让服务器接受。
通过线程来存储来存储用户的Socket连接状态,接受并处理用户发过来的信息,返回处理信息。
客户机也通过线程来接受服务器的处理数据做出响应。
设计的难点是文件的传输,首先通过原有的服务器获得目标客户机的IP地址和端口,然后在客户机上建立服务器,通过要发送的文件的客户机连接接受文件的客户机用DataInputStream和DataOutputStream来推送到输入、输出流。
然后客户机接受并保存。
三、系统详细设计
1.功能模块
2.流程图
四、程序源代码及注释
publicChatRoom(Stringu_name,Socketclient){
//赋值
name=u_name;
clientSocket=client;
onlines=newVector();
setTitle(name);
setResizable(false);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setBounds(200,100,688,510);
contentPane=newJPanel();
setContentPane(contentPane);
contentPane.setLayout(null);
//聊天信息显示区域
JScrollPanescrollPane=newJScrollPane();
scrollPane.setBounds(10,10,410,300);
getContentPane().add(scrollPane);
textArea=newJTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);//激活自动换行功能
textArea.setWrapStyleWord(true);//激活断行不断字功能
textArea.setFont(newFont("sdf",Font.BOLD,13));
scrollPane.setViewportView(textArea);
//打字区域
JScrollPanescrollPane_1=newJScrollPane();
scrollPane_1.setBounds(10,347,411,97);
getContentPane().add(scrollPane_1);
finalJTextAreatextArea_1=newJTextArea();
textArea_1.setLineWrap(true);//激活自动换行功能
textArea_1.setWrapStyleWord(true);//激活断行不断字功能
scrollPane_1.setViewportView(textArea_1);
//关闭按钮
finalJButtonbtnNewButton=newJButton("关闭");
btnNewButton.setBounds(214,448,60,30);
getContentPane().add(btnNewButton);
//发送按钮
JButtonbtnNewButton_1=newJButton("发送");
btnNewButton_1.setBounds(313,448,60,30);
getRootPane().setDefaultButton(btnNewButton_1);
getContentPane().add(btnNewButton_1);
//在线客户列表
listmodel=newUUListModel(onlines);
list=newJList(listmodel);
list.setCellRenderer(newCellRenderer());
list.setOpaque(false);
Borderetch=BorderFactory.createEtchedBorder();
list.setBorder(BorderFactory.createTitledBorder(etch,"<"+u_name+">"+"在线用户:
",TitledBorder.LEADING,TitledBorder.TOP,newFont("sdf",Font.ITALIC,20),Color.black));
JScrollPanescrollPane_2=newJScrollPane(list);
scrollPane_2.setBounds(430,10,245,375);
scrollPane_2.setOpaque(false);
scrollPane_2.getViewport().setOpaque(false);
getContentPane().add(scrollPane_2);
//文件传输栏
progressBar=newJProgressBar();
progressBar.setBounds(430,390,245,15);
progressBar.setMinimum
(1);
progressBar.setMaximum(100);
getContentPane().add(progressBar);
//文件传输提示
lblNewLabel=newJLabel(
"文件传输信息栏:
");
lblNewLabel.setFont(newFont("SimSun",Font.PLAIN,12));
lblNewLabel.setBackground(Color.WHITE);
lblNewLabel.setBounds(430,410,245,15);
getContentPane().add(lblNewLabel);
try{
oos=newObjectOutputStream(clientSocket.getOutputStream());
//记录上线客户的信息,并发送给服务器
MessagetoMsg=newMessage();
toMsg.setType(0);
toMsg.setName(name);
toMsg.setTimer(getTimer());
oos.writeObject(toMsg);
oos.flush();
//启动客户接收线程
CThread=newClientInputThread();
CThread.start();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//发送按钮
btnNewButton_1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringinfo=textArea_1.getText();
Listto=list.getSelectedValuesList();
if(to.size()<1){
JOptionPane.showMessageDialog(getContentPane(),"请选择聊天对象");
return;
}
if(to.toString().contains(name+"(我)")){
JOptionPane
.showMessageDialog(getContentPane(),"不能向自己发送信息");
return;
}
if(info.equals("")){
JOptionPane.showMessageDialog(getContentPane(),"不能发送空信息");
return;
}
MessagetoMsg=newMessage();
toMsg.setType
(1);
toMsg.setName(name);
Stringtime=getTimer();
toMsg.setTimer(time);
toMsg.setInfo(info);
HashSetset=newHashSet();
set.addAll(to);
toMsg.setClients(set);
//自己发的内容也要现实在自己的屏幕上面
textArea.append(time+"我对"+to+"说:
\r\n"+info+"\r\n");
sendMessage(toMsg);
textArea_1.setText(null);
textArea_1.requestFocus();
}
});
//关闭按钮
btnNewButton.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(isSendFile||isReceiveFile){
JOptionPane.showMessageDialog(contentPane,
"正在传输文件中,您不能离开...",
"ErrorMessage",JOptionPane.ERROR_MESSAGE);
}else{
btnNewButton.setEnabled(false);
MessagetoMsg=newMessage();
toMsg.setType(-1);
toMsg.setName(name);
toMsg.setTimer(getTimer());
sendMessage(toMsg);
b=false;
}
}
});
//离开
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
//TODOAuto-generatedmethodstub
if(isSendFile||isReceiveFile){
JOptionPane.showMessageDialog(contentPane,
"正在传输文件中,您不能离开...",
"ErrorMessage",JOptionPane.ERROR_MESSAGE);
}else{
intresult=JOptionPane.showConfirmDialog(getContentPane(),
"您确定要离开聊天室");
if(result==0){
MessagetoMsg=newMessage();
toMsg.setType(-1);
toMsg.setName(name);
toMsg.setTimer(getTimer());
sendMessage(toMsg);
//CThread.interrupt();
b=false;
}
}
}
});
//列表监听
list.addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){
Listto=list.getSelectedValuesList();
if(e.getClickCount()==2){
if(to.toString().contains(name+"(我)")){
JOptionPane.showMessageDialog(getContentPane(),"不能向自己发送文件");
return;
}
//双击打开文件文件选择框
FileChoosechooser=newFileChoose();
chooser.setDialogTitle("选择文件框");//标题哦...
chooser.showDialog(getContentPane(),"选择");//这是按钮的名字..
//判定是否选择了文件
if(chooser.getSelectedFile()!
=null){
//获取路径
filePath=chooser.getSelectedFile().getPath();
Filefile=newFile(filePath);
//文件为空
if(file.length()==0){
JOptionPane.showMessageDialog(getContentPane(),filePath+"文件为空,不允许发送.");
return;
}
MessagetoMsg=newMessage();
toMsg.setType
(2);//请求发送文件
toMsg.setSize(newLong(file.length()).intValue());
toMsg.setName(name);
toMsg.setTimer(getTimer());
toMsg.setFileName(file.getName());//记录文件的名称
toMsg.setInfo("请求发送文件");
//判断要发送给谁
HashSet
set.addAll(list.getSelectedValuesList());
toMsg.setClients(set);
sendMessage(toMsg);
}
}
}
});
}
五、实验数据、结果分析
1.开启服务器
服务器用来将用户发送的信息发送到指定用户,所以程序执行
之前服务器一定要开启。
如图5.1所示。
图5.1开启服务器
2.用户登录
用户可以通过输入自己的账号密码来登录聊天室,如图5.2所示。
图5.2登录窗口
3.用户注册
当用户第一次登录时,可以通过自己注册一个账号来进入聊天室。
如图5.3所示。
图5.3用户注册
4.多用户登录
当有用户上线时服务器会向所有在线用户发送用户上线通知。
如图5.4、5.5所示。
图5.4用户上线
5.5多用户上线
5.聊天
用户可以通过选中在线用户列表中的用户,向选中用户发送消息,可以选择一个或多个用户发送消息。
如图5.6所示。
图5.6聊天功能展示
6.发送文件
首先用户选择要发送文件的一个或多个用户,然后在用户列表双击,弹出选择文件框选取文件(如图5.7所示),待接收方同意接受并选择好保存位置后开始发送(如图5.8、5.9所示),直至发送完成(如图5.10所示)。
图5.75号向2、3、4号发送文件
图5.8等待接收方确认
图5.9文件传输
图5.10传输完毕
六、总结
这次我们所设计的课题是个聊天室,网络聊天已经成为人与人之间交流的一种方式,它能把复杂的事情简单化。
伴随着互联网的发展,日常交流变得越来越重要,同时人们更亲睐实时沟通方式,于是在线聊天室应运而生。
通过这次实习,让我们对网络的理解更加深刻,对编程的思路也更加清晰。
在这次实习中,我们遇到了很多问题,比如如何通过代码将网络中的TCP连接写出来,如何传输数据等同时我们在代码也出现了许多错误,如IO错误,Socket连接错误等。
这些错误虽然在当时我们感觉比较困难,不能理解,但是当我们一个一个的去查阅各种资料,解决问题后,发现其实所有的问题只要自己耐下心去了解,去学习,一切困难都会迎刃而解。
同时自己也在这次课程设计中收获了许多编程经验,能力上也得到了很大的提高。
编程一直以来都是一件很枯燥乏味的事情,但我们必须严格要求自己,按照老师所说的编程思想,分块编写。
可能因为某一处的小的错误而导致整个程序的无法运行,然后需要努力去找资料、XX解决。
但是当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。
因此在以后的生活和学习的过程中,我们一定会把实习的精神带到生活中,不畏艰难,勇往直前!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 聊天室 课程设计