JAVA局域网聊天课程设计.docx
《JAVA局域网聊天课程设计.docx》由会员分享,可在线阅读,更多相关《JAVA局域网聊天课程设计.docx(23页珍藏版)》请在冰点文库上搜索。
JAVA局域网聊天课程设计
淮海工学院计算机工程学院
课程设计报告
设计名称:
面向对象课程设计
选题名称:
局域网聊天程序的设计与实现
姓名:
薛思雨学号:
511020825
专业班级:
软件工程D软件101
系(院):
计算机工程学院
设计时间:
2012.6.08~2012.6.25
设计地点:
软件实验室、教室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。
其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。
2.课程设计任务与要求:
课程设计任务:
局域网聊天程序的设计与实现
该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。
客户端程序:
可连接到服务器,并将消息发送到服务器端和接受服务器端发送来的信息。
服务器端程序:
可将消息发送到客户端和接受客户端发送来的信息
课程设计要求:
课程设计可选用NetBeans、Eclipse、JBuilder等作为开发平台以提高开发效率,尽可能熟练掌握其中一种集成开发环境。
建议采用UML建模技术进行系统的分析设计,在Visio中画出系统用例图和类图,并将UML图复制到设计报告中。
通过这次设计,要求掌握以下内容:
1)面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用
2)类、包、接口的定义与使用
3)常用工具类与算法的实现(数组、向量、字符串、链表)
4)Java常用标准GUI组件及其事件处理
5)Java的异常处理机制
6)Java的数据库连接技术
7)Java的多线程技术与动画制作
8)Java的网络编程
设计报告书封面和正文格式要符合淮海工学院课程设计报告书封面与正文标准格式要求,设计报告内容不少5000字。
本课程设计报告内容包括:
课程设计目的、设计任务与要求、设计说明书(包括:
需求分析、概要设计、详细设计)、设计成果(包括:
运行界面、主要代码、测试结果)和设计心得、附录或参考资料几个部分。
(1)每位同学通过智能教学平台需提交可独立运行的应用程序,要求程序书写规范,源程序需加必要的注释;
(2)每位同学需独立提交书面设计报告书(每人一份),要求编排格式统一、规范、内容充实,同时通过教学平台提交设计报告电子版;
(3)提交日期:
第19周周二(2012年6月26日)之前。
3.课程设计说明书
(1)需求分析
功能分析:
该程序实现局域网内的聊天功能,包括服务器端程序和客户端程序两部分。
服务器端具有建立侦听服务,转发聊天信息,响应用户下线,统计在线人数。
客户端具有请求登陆,请求下线,发送接收群聊和私聊信息,记事本,发送接收文件功能。
表1服务器各模块名称功能汇总表
序号
模块名
基本功能
1
端口设置
设置侦听的端口号,默认为7777。
2
启动服务
开启侦听端口,允许客户端连接。
3
停止服务
关闭倾听端口,中断所有客户端的连接。
再次点击则退出。
4
帮助
显示各个模块的功能及操作方法。
5
状态栏
统计在线人数。
表2客户端各模块名称功能汇总表
序号
模块名
基本功能
1
连接设置
设置要连接的服务器所在主机的IP地址和侦听听端口。
2
文件传输
可以与指定的IP地址传送文件。
3
记事本
记录重要的信息并存到本地。
4
换肤
更改背景图片(可换四种)。
5
发送
发送聊天内容。
6
退出
关闭客户端。
(2)概要设计
3、详细设计
服务器端主要包括4个文件,它们的功能如下:
1.Server.java:
其主要功能为定义服务器端的界面,添加事件侦听与事件处理。
调用serverRun类来实现服务器端对客户端的连接;调用Details类来实现服务器端用户上线与下线的侦听;用变长数组来记录用户列表。
2.PortConf.java:
是用户对服务器侦听端口进行修改配置的类。
3.Objecting.java:
要传输某一类的对象,就要实现Serializable接口,就可以在网络上传输。
4.ServerHelp.java:
服务器端的帮助。
客户端主要包括5个文件,它们的功能如下:
1.LogIn.java:
注册并登陆到服务器。
2.Client.java:
其主要功能为定义客户端的界面,添加事件侦听与事件处理。
该类定义了connect()与disconnect()方法实现与服务器的连接和断开连接;调用ClientSocket类实现客户端消息的接收,然后转发到客户端的主界面上。
3.ConnectConf.java:
是用户对所要连接的服务器IP地址和端口的配置。
4.NoteBook.java:
记录重要的事情,并存在本地。
5.UserHelp.java:
客户端的帮助信息。
表3聊天室基本功能表
序号
文件名
基本功能
1
Server.java
启动服务器
2
LogIn.java
注册登录。
3
Client.java
客户端主界面。
4
ConnectConf.java
设置连接的服务器IP地址和端口。
5
PortConf.java
设置服务器侦听端口。
6
Objecting.java
传输对象。
7
NoteBook.java
便签,可保存到本地。
8
ServerHelp.java
服务端帮助信息
9
UserHelp.java
客户端帮助信息。
4.课程设计成果
运行界面:
1服务端
服务端界面(Server.java):
端口设置界面:
服务端帮助界面:
2注册登录界面(LogIn.java):
3客户端主界面:
私聊界面:
另一头客户端:
客户端连接设置:
记事本界面:
换肤:
客户端帮助界面:
主要代码:
Server.java//服务端
classserverRunextendsThread{
publicvoidrun(){
try{
System.out.println("开始SERVERRUN");
serversocket=newServerSocket(port);
area.append((newDate()).toLocaleString()+"服务器启动@"+port
+"端口正在侦听...\n");
start.setEnabled(false);
set.setEnabled(false);
while(true){
Socketsocket=serversocket.accept();//接受1个客户连接
System.out.println("连接成功");
BufferedReaderbr=newBufferedReader(
newInputStreamReader(socket.getInputStream()));//获得客户名称
Stringname=br.readLine();
area.append((newDate()).toLocaleString()+"服务器接收用户"
+name+"的连接\n");
soconly.add(socket);//收集所有SOCKET
num++;
showStatus.setText("当前在线人数:
"+num);//发送新用户消息
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();//获得其他SOCKET的通信口
ObjectOutputStreamout=newObjectOutputStream(s
.getOutputStream());
out.writeObject("【系统消息】"+name+"用户进入");}
sockets.put(name,socket);//收集所有有标市的SOCKET
Vectorv=getList();
Iteratorj=soconly.iterator();
while(j.hasNext()){
Sockets=(Socket)j.next();//获得其他SOCKET的通信口
ObjectOutputStreamout=newObjectOutputStream(s
.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表进入");
}
Detailsd=newDetails(socket);
socket_thread.put(name,d);//收集SOCKET线乘
d.start();
}
}catch(Exceptione){
e.printStackTrace();
}}}
classDetailsextendsThread{
booleanalive=true;
ObjectInputStreamin;
ObjectOutputStreamout;
Socketsocket;//客户SOCKET
Details(Socketsocket){
this.socket=socket;
}
publicvoidrun(){
while(alive){
try{
in=newObjectInputStream(socket.getInputStream());
Objectingobjecting=(Objecting)in.readObject();//获得对象
Stringname=objecting.getKey();//获得名字
Stringcontent=objecting.getValue();//获得内容
if(name.equalsIgnoreCase("all")){
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();//获得其他SOCKET的通信口
out=newObjectOutputStream(s.getOutputStream());
out.writeObject(content);
System.out.println("Send");
}
}
if(name.equalsIgnoreCase("exit")){
Detailsthread=(Details)socket_thread.get(content);
thread.alive=false;
area.append((newDate()).toLocaleString()+""
+content+"离开\n");
socket.close();
soconly.remove(socket);//群发SOCKET消失
sockets.remove(content);//标市SOCKET消失
num--;
showStatus.setText("当前在线人数:
"+num);
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();//获得其他SOCKET的通信口
out=newObjectOutputStream(s.getOutputStream());
out.writeObject("【系统消息】"+content+"用户离开");
}
Vectorv=getList();
Iteratorj=soconly.iterator();
while(j.hasNext()){
Sockets=(Socket)j.next();//获得其他SOCKET的通信口
ObjectOutputStreamout=newObjectOutputStream(s
.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表离开");
}
}
if(!
name.equalsIgnoreCase("all")
&!
name.equalsIgnoreCase("exit")){
area
.append((newDate()).toLocaleString()
+"处理私聊信息\n");
Sockets=(Socket)sockets.get(name);
out=newObjectOutputStream(s.getOutputStream());
out.writeObject(content);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
Client.java//客户端
classClientSocketextendsThread{
ObjectInputStreamin;
ObjectOutputStreamout;
PrintWriterpw;
publicvoidrun(){
try{
pw=newPrintWriter(socket.getOutputStream(),true);
pw.println(name);//发送标记信息!
名字
}catch(Exceptione){
e.printStackTrace();
}
while(true){
try{
in=newObjectInputStream(socket.getInputStream());
Objecto=in.readObject();
if(oinstanceofString){
area.append(o.toString()+"\n");
}
if(oinstanceofVector){
System.out.println("列表操作");
Vectorv=(Vector)o;
list.removeAll();
Object[]obj=v.toArray();
for(inti=0;iSystem.out.println((String)obj[i]);
list.add((String)obj[i]);
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
list.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringto=list.getSelectedItem();
Stringcontent=JOptionPane.showInputDialog(null,"输入向"+to
+"发送的私聊信息","私聊",JOptionPane.INFORMATION_MESSAGE);
if(content==null){
return;
}else{
Objectingo=newObjecting(to,"◆◆私聊信息◆◆\n"+name+""
+(newDate()).toLocaleString()+"\n"+content);//获得消息准备发送
try{
ObjectOutputStreamout=newObjectOutputStream(socket
.getOutputStream());
out.writeObject(o);
JOptionPane.showMessageDialog(null,to+"收到消息");
}catch(Exceptione2){
e2.printStackTrace();
}
}
}
});
text.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(text.getText().equals("")){
JOptionPane.showMessageDialog(null,"消息为空");
return;
}else{
Objectingo=newObjecting("all",name+":
"
+text.getText());//获得消息准备发送
try{
ObjectOutputStreamout=newObjectOutputStream(socket
.getOutputStream());
out.writeObject(o);
text.setText("");
}catch(Exceptione2){
e2.printStackTrace();
}
}
}
});
Objecting.java//传输对象
publicclassObjectingimplementsSerializable{
Stringkey;
Stringvalue;
publicObjecting(){}
publicObjecting(Stringkey,Stringvalue){
this.key=key;
this.value=value;}
publicvoidsetKey(Stringkey){
this.key=key;}
publicvoidsetValue(Stringvalue){
this.value=value;}
publicStringgetKey(){
returnkey;}
publicStringgetValue(){
returnvalue;}}
测试结果:
1客户端
端口设置:
·设置成功
·设置失败
在线人数:
停止:
②客户端:
连接设置:
·成功:
·失败:
记事本:
客户端帮助界面:
换肤:
5.课程设计心得
这次的课程设计,我觉得还是很成功的。
先是成功实现了此次设计的要求,另外我还添加了一些辅助功能。
一开始并不打算选这个题目的时候,后来只是抱着试试看的心理,这部分的知识应该说是没有学过,老师上课也没有讲这个SOCKET套接字的部分,是要我们课后自己看的。
我只好把书上的一段基于客户-服务器端的计算三角形面积的java代码先调试一下,熟悉一下代码运行的效果,给我一点思路。
再根据这个程序的框架,来编写代码,但是后来发现自己编代码并不简单,折腾了好久也没成功,觉得自己的设计思路有点偏差,所以才导致这个程序的失败,看来把理论变成实践可真不是一件简简单单就能完成的事。
接下来的几天,我只好到网上的一些专门学习JAVA的论坛里找些资料来看看,也试着调试调试别人编的程序,好给自己的课程设计定一个大体的框架。
在坛子里逛了许久,我的程序的雏形就也差不多完成了,只是简单的聊天功能,运行服务器,在给定端口侦听,转发客户端的消息,最后显示在客户端聊天窗口的文本域中。
虽然这才是只是一点点的成功,但也使这次课程设计有了好的开端,我相信后面的问题也就不算问题了。
我又陆陆续续地添加些功能,让程序更加丰满,最重要的是设计出来的程序更加的合理,更人性化。
先是聊天室服务器端启动服务器时,将创建侦听套接字,创建用户列表,创建并启动侦听线程。
用户登录时,将创建套接字,与服务器直接连接,并创建客户端接收线程。
服务器端侦听到有用户上线后,将创建新的用户节点,并在主界面上显示用户上线,发送新的用户列表。
客户端发送信息时,将要发送的内容通过output.writeObject();进行发送。
服务器端发送信息时,如果是发送给所有人,就遍历用户链表,如果是发送给某个用户,先在链表中找到该节点,通过output.writeObject()发送信息。
服务器端和客户端接收信息时,先读取聊天信息标识,做出判断后,依次读取信息,处理信息,并在主界面上显示。
服务器端还要将准备好的信息转发给指定的用户。
当服务器端侦听到有用户下线后,将删除该