计算机网络聊天室课程设计.docx

上传人:b****7 文档编号:9885886 上传时间:2023-02-07 格式:DOCX 页数:19 大小:442.90KB
下载 相关 举报
计算机网络聊天室课程设计.docx_第1页
第1页 / 共19页
计算机网络聊天室课程设计.docx_第2页
第2页 / 共19页
计算机网络聊天室课程设计.docx_第3页
第3页 / 共19页
计算机网络聊天室课程设计.docx_第4页
第4页 / 共19页
计算机网络聊天室课程设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

计算机网络聊天室课程设计.docx

《计算机网络聊天室课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络聊天室课程设计.docx(19页珍藏版)》请在冰豆网上搜索。

计算机网络聊天室课程设计.docx

计算机网络聊天室课程设计

 

《计算机网络》课程

设计报告

 

设计题目:

聊天室

同组人姓名:

王巍瑾

马志超

周旭

同组人学号:

********105

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("请求发送文件");

//判断要发送给谁

HashSetset=newHashSet();

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解决。

但是当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。

因此在以后的生活和学习的过程中,我们一定会把实习的精神带到生活中,不畏艰难,勇往直前!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1