资源描述
辽宁科技大学装备制造学院
计算机网络课程设计汇报
题目: 网络聊天室设计和实现
院系: 装备制造学院
专业: 计算机科学和技术
班级: 二班
姓名: 张和鑫
学号: 18
指导老师: 秦维佳
设计时间:6月21日—6月28日
辽宁科技大学装备制造学院
6月
计算机网络课程设计汇报
课程设计题目:计算机网络聊天室设计和实现
目标和任务:
目标:熟悉网络编程知识和技能,掌握Socket编程方法。
任务:完成网络聊天程序编制和调试。
要求:
1.使用MSN或QQ,分析聊天程序功效需求。
2.采取自己熟悉开发环境和语言完成设计任务,如:Java、C++、Visual Basic、SQL server等。
3.课程设计汇报内容包含,课程设计目标、设计任务、要求、设计说明书。
4.设计说明书包含:需求分析、概要设计、具体设计。
5.设计结果包含:关键运行界面、关键代码、测试结果、总结、参考资料。
总体设计:(聊天室所包含功效模块)
用户端及服务器端程序整合 用户登录模块设计
用户列表模块设计 文本聊天模块设计
指定人物聊天 程序界面设计 群聊
工作安排:能够2人合作,写清具体分工。
张和鑫:用户端及服务器端程序整合,用户登录模块设计,程序界面设计
群聊 ,用户列表模块设计, 文本聊天模块设计,指定人物聊天
提交内容:
(1)每组同学提交可独立运行应用程序
(2)每位同学提交书面设计汇报一份(每人一份)
(3)提交日期6月27-28日
批语:
成绩:
月 日
目 录
1. 序言 1
1.1 背景 1
1.2 相关技术 2
2. 程序设计和实现 2
2.1需求分析 2
2.2 程序结构 3
3. 测试结果 17
4. 总结 20
参考文件.................................................................................................................................. .......21
1. 序言
1.1 背景
在当今信息时代,越来越多聊天工具被应用 ,Java语言是当今流行网络编程语言,它含有面向对象、和平台无关、安全、多线程 等特点。使用Java语言不仅能够实现大型企业级分布式应用系统,还能够为小型、嵌入 式设备进行应用程序开发。面向对象开发方法是当今世界最流行开发方法,它不仅含有更贴近自然语义,而且有利于软件维护和继承。为了深入巩固课堂上所学到知识,深刻把握Java语言关键概念及其面向对象特征,锻炼我们熟练应用面向对象思想和设计方法处理实际问题能力,开设了Java程序设计课程设计。
2. 此次课程设计题目为简单聊天室,经过做巩固所学Java语言基础知识,促进Java语言编辑基础功,掌握JDK、JCreator等开发工具利用,拓宽常见类库应用。使我们经过该教学步骤和手段,把所学课程及相关知识加以融会贯通,全方面掌握Java语言编程思想及面向对象程序设计方法,为以后从事实际工作打下坚实基础。
1.2 相关技术
CPU:Pentium 2.8GHz以上
内存:256MB以上
硬盘空间:80G以上
操作系统:Windows XP
运行环境:JDK,JCreator
2. 程序设计和实现
2.1需求分析
Java是一个简单,面向对象,分布式,解释,键壮,安全,结构中立,可移植,性能很优异,多线程,动态语言。Java去掉了C++语言很多功效,如:指针运算、结构、typedefs、#define,让Java语言功效很精炼,并增加了部分很有用功效,如自动搜集碎片。这将降低日常犯错50%。而且,Java很小,整个解释器只需215KRAM。
所以利用JAVA程序编写聊天室,实现简单聊天功效。此次课程设计做是Java简单聊天室,它是图形界面、线程、流和文件等技术综合应用,其界面关键采取了java.awt包,javax.swing包等。 程序实现了聊天室基础功效,其中有:
(1)开启服务器:实现网络连接,为注册进入聊天室做准备。
(2)注册登陆界面:填写基础信息如姓名等,能够供多人进入实现多人聊天功效。
(3)发送信息:为用户发送信息提供平台。
(4)离开界面:使用户退出聊天室。
(5)关闭服务器:断开和网络连接,根本退出聊天室。
2.2 程序结构
开启服务器
注册界面
发送信息(用户A)
发送信息
(用户B)
发送信息
(用户C)
关闭服务器
图1 程序基础框图
表1 聊天室基础功效表
序号
文件名
关键功效
1
ServerHost
被服务器调用
2
Client
显示聊天室
3
ClientUser
被用户端调用
4
LogIn
注册登陆
5
Objecting
连接服务器
6
Server
开启服务器
2.3 代码实现
(1)Server.java
package Chat;
import .*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
public class Server implements ActionListener{
int count=0;//统计点机关闭按钮次数2次关闭
Vector soconly=new Vector();//只有SOCKET,用于群发
HashMap sockets=new HashMap();//全部用户SOCKET
HashMap socket_thread=new HashMap();//Socket所在线乘,用于退出;
ServerSocket serversocket;
JFrame frame;
JTextArea area=new JTextArea();
JPanel panel=new JPanel();
JButton start=new JButton("开启");
JButton stop=new JButton("停止");
public Server() {
//设置样式
//frame.setDefaultLookAndFeelDecorated(true);//
frame=new JFrame("服务器");
//添加
panel.add(start);
panel.add(stop);
frame.add(panel,BorderLayout.NORTH);
frame.add(area,BorderLayout.CENTER);
frame.pack();
center();
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.setVisible(true);
//添加监听
start.addActionListener(this);
stop.addActionListener(this);
System.out.println("new");
}
public void center(){
Toolkit toolkit=Toolkit.getDefaultToolkit();
Dimension e=toolkit.getScreenSize();
int x=e.width/2-(int)(frame.getSize().getWidth()/2);
int y=e.height/2-(int)(frame.getSize().getHeight()/2);
frame.setLocation(x,y);
}
public void actionPerformed(ActionEvent e){
JButton btn=(JButton)e.getSource();
if(btn==start){
serverRun serverrun=new serverRun();
System.out.println("gogo");
serverrun.start();
}
if(btn==stop){
try{
Iterator i = soconly.iterator();
while (i.hasNext()) {
Socket s = (Socket) i.next(); //取得其它SOCKET通信口
ObjectOutputStream out = new ObjectOutputStream(s.
getOutputStream());
Objecting bj=new Objecting();
out.writeObject("系统消息-----服务器立即关闭!!!!!!请立即关闭用户端");
}
count++;
if(count==2){
System.exit(0);
}
JOptionPane.showMessageDialog(frame,"已通知用户端,请再次点击关闭按钮关闭");
}catch(Exception ex){ex.printStackTrace();}
}
}
class serverRun extends Thread{
public void run(){
try{
System.out.println("开始SERVERRUN");
serversocket=new ServerSocket(55555);
area.append("服务器开启\n");
start.setEnabled(false);
while(true){
Socket socket=serversocket.accept();//接收1个用户连接
System.out.println("连接成功");
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));//取得用户名称
String name=br.readLine();
area.append("服务器接收用户"+name+"连接\n");
soconly.add(socket);//搜集全部SOCKET
//发送新用户消息
Iterator i=soconly.iterator();
while(i.hasNext()){
Socket s=(Socket)i.next();//取得其它SOCKET通信口
ObjectOutputStream out=new ObjectOutputStream(s.getOutputStream());
out.writeObject("系统消息-----"+name+"用户进入"+"------"); }
sockets.put(name,socket);//搜集全部有标市SOCKET
Vector v=getList();
Iterator j=soconly.iterator();
while(j.hasNext()){
Socket s = (Socket) j.next(); //取得其它SOCKET通信口
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表进入"); }
Details d=new Details(socket);
socket_thread.put(name,d);//搜集SOCKET线乘
d.start();
}
}catch(Exception e){e.printStackTrace();}
} }
class Details extends Thread{
boolean alive=true;
ObjectInputStream in;
ObjectOutputStream out;
Socket socket;//用户SOCKET
Details(Socket socket){
this.socket=socket;
}
public void run(){
while(alive){
try{
in = new ObjectInputStream(socket.getInputStream());
Objecting objecting=(Objecting)in.readObject();//取得对象
String name=objecting.getKey();//取得名字
String content=objecting.getValue();//取得内容
if(name.equalsIgnoreCase("all")){
Iterator i=soconly.iterator();
while(i.hasNext()){
Socket s=(Socket)i.next();//取得其它SOCKET通信口
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(content);
System.out.println("Send");
} }
if(name.equalsIgnoreCase("exit")){
Details thread=(Details)socket_thread.get(content);
thread.alive=false;
area.append(content+"离开\n");
socket.close();
soconly.remove(socket);//群发SOCKET消失
sockets.remove(content);//标市SOCKET消失
Iterator i=soconly.iterator();
while(i.hasNext()){
Socket s=(Socket)i.next();//取得其它SOCKET通信口
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject("系统消息-----"+content+"用户离开"+"------"); }
Vector v=getList();
Iterator j=soconly.iterator();
while(j.hasNext()){
Socket s = (Socket) j.next(); //取得其它SOCKET通信口
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(v);
System.out.println("服务器发送用户列表离开");
}
}
if(!name.equalsIgnoreCase("all")&!name.equalsIgnoreCase("exit")){
area.append("处理私聊信息");
Socket s=(Socket)sockets.get(name);
out=new ObjectOutputStream(s.getOutputStream());
out.writeObject(content);
}
}catch(Exception e){e.printStackTrace();}
} } }
public Vector getList(){
Vector v=new Vector();
Set set=sockets.keySet();
Iterator i=set.iterator();
while(i.hasNext()){
v.add(i.next());
}
return v;
}
public static void main(String args[]){
new Server(); } }
(2)Objecting.java
package Chat;
import java.io.Serializable;
public class Objecting implements Serializable{
String key;
String value;
public Objecting(){ }
public Objecting(String key,String value) {
this.key =key;
this.value=value;}
public void setKey(String key) {
this.key = key; }
public void setValue(String value) {
this.value = value; }
public String getKey() {
return key; }
public String getValue() {
return value;} }
(3)LogIn.java
package Chat;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class LogIn implements ActionListener{
JFrame frame;
JLabel title=new JLabel("免注册版");
JPanel banner=new JPanel();
JTextField text=new JTextField(10);
JPanel body=new JPanel();
JPanel buttom=new JPanel();
JLabel name=new JLabel("输入姓名");
JButton send=new JButton("进入");
public LogIn() {
frame=new JFrame("注册");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
banner.add(title);
body.add(name);
body.add(text);
buttom.add(send);
frame.add(banner,BorderLayout.NORTH);
frame.add(body,BorderLayout.CENTER);
frame.add(buttom,BorderLayout.SOUTH);
frame.pack();
center();
frame.setVisible(true);
send.addActionListener(this); }
public void center(){
Toolkit toolkit=Toolkit.getDefaultToolkit();
Dimension e=toolkit.getScreenSize();
int x=e.width/2-(int)(frame.getSize().getWidth()/2);
int y=e.height/2-(int)(frame.getSize().getHeight()/2);
frame.setLocation(x,y); }
public void actionPerformed(ActionEvent e){
if(text.getText().equals("")){
JOptionPane.showMessageDialog(frame,"姓名不能为空");
return;
}else{
new Client(text.getText());
frame.dispose(); } }
public static void main(String args[]){
new LogIn(); } }
(4)ClientUser.java
package Chat;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import .*;
import java.io.*;
public class ClientUser extends WindowAdapter implements ActionListener,Runnable{
public JFrame jf;
public JTextField jt;
public JTextField name;
public JButton connect;
public JScrollPane jsp;
public JTextArea jta;
public JButton jb;
public JLabel l;
Socket soc;
InputStream soc_in;
OutputStream soc_out;
BufferedReader Bsoc_in;
PrintWriter Psoc_out;
public ClientUser(){
jf=new JFrame("Client Chat Room");
jta=new JTextArea(10,30);
jta.setEditable(false);
jsp=new JScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jt=new JTextField(30);
name=new JTextField(5);
l=new JLabel("Please in put your name");
connect=new JButton("Connect");
connect.addActionListener(this);
jt.addActionListener(this);
jb=new JButton("Send The Message");
jb.addActionListener(this);
JPanel jp=new JPanel();
JPanel jp2=new JPanel();
jp.setLayout(new FlowLayout());
jp.add(jt);
jp.add(jb);
jp2.add(l);
jp2.add(name);
jp2.add(connect);
Container c=jf.getContentPane();
c.setLayout(new GridBagLayout());
GridBagConstraints gbc=new GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
c.add(jp2,gbc);
gbc.gridx=0;
gbc.gridy=1;
c.add(jsp,gbc);
gbc.gridy=2;
c.add(jp,gbc);
jf.pack();
jf.setVisible(true); }
public static void main(String[] args) {
ClientUser cuser=new ClientUser(); }
public void windowClosing(WindowEvent e){
System.exit(0);}
public void actionPerformed(ActionEvent e){
if (e.getSource()==connect){
if(name.getText().equals("")){
new JOptionPane().showMessageDialog(null,"Please in Put your name First!");
}
else{
try{
soc=new Socket("localhost",55555);
Psoc_out=new PrintWriter(soc.getOutputStream(),true);
Bsoc_in=new BufferedReader(new InputStreamReader(soc.getInputStream()));
Psoc_out.println(name.getText());
}
catch(Exception e1){e1.printStackTrace();}
name.setEditable(false);
new Thread (this).start();
} }
if(e.getSource()==jt||e.getSource()==jb){
jta.append(name.getText()+":"+jt.getText()+"\n");
Psoc_out.println(name.getText()+":"+jt.getText());
jt.setText("");
} }
public void run(){
String text;
while(true){
try{
text=Bsoc_in.readLine();
jta.append(text+"\n");
}
catch(Exception e){e.printStackTrace();}
} }
(5)Client.java
package Chat;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import .*;
import java.io.*;
import java.util.Vector;
public c
展开阅读全文