完整word版山寨QQ韩顺平版word文档良心出品.docx
《完整word版山寨QQ韩顺平版word文档良心出品.docx》由会员分享,可在线阅读,更多相关《完整word版山寨QQ韩顺平版word文档良心出品.docx(33页珍藏版)》请在冰豆网上搜索。
完整word版山寨QQ韩顺平版word文档良心出品
这是一个简单的javaProject项目,没有涉及到数据库界面
对这个项目中完成的功能进行阐述:
1、qq用户登录:
用户账号为1、2、3一直到50,密码都为123456,由于没有涉及到数据库,所以只是简单的在服务器进行验证。
2、实现1对1之间的聊天,实现1对多之间的聊天。
3、实现用户上线显示功能
具体的演示为:
1、启动服务器QqServer下com.qq.view.MyServerFrame,在该类下面启动服务器
2、启动客户端QqClient下com.qq.view.QqClientLogin,在该类下面输入账号和密码登入
ps:
聊天时要把要把需要聊天的窗口都打开,才能看到。
比如1和2聊天,必须打开1对2聊天的窗口和2对1聊天的窗口
QQ客户端:
QQ服务器
下面的是关于各个包的源代码,小伙伴们可以新建一个class,然后把这些拷贝上去就可以用了,当然前提是按照上面的工程创建好包
Image文件夹下用到的图片:
命名为:
beibu.gif
命名为:
xiangdao.png
命名为:
quxiao.png
命名为:
qq.png
命名为:
mm.png
命名为:
clear.png
命名为:
dengru.png
QqClientConService类:
packagecom.qq.client.model;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
import.Socket;
importcom.qq.client.tools.ClientConServerThread;
importcom.qq.client.tools.ManageClientConServerThread;
importmon.Message;
importmon.User;
/**
*客户端连接服务器后台
**/
publicclassQqClientConService{
publicSocketclient;
//判断是否成功登录,成功返回true,否则返回false
publicbooleansendLoginInfoToServer(Objecto){
booleanisLogin=false;
try{
//创建连接
client=newSocket("localhost",9999);
ObjectOutputStreamoos=newObjectOutputStream(client.getOutputStream());
oos.writeObject(o);
ObjectInputStreamois=newObjectInputStream(client.getInputStream());
Messagemessage=(Message)ois.readObject();
//登录成功的判断
if(message.getMesType()==1){
isLogin=true;
//登录成功,创建一个改客户端和服务器的线程
ClientConServerThreadccst=newClientConServerThread(client);
//把改线程添加到管理线程的map中
ManageClientConServerThread.addClientConServerThread(((User)o).getName(),ccst);
//启动该线程
newThread(ccst).start();
}
}catch(Exceptione){
e.printStackTrace();
}
returnisLogin;
}
}
QqClientUser类:
packagecom.qq.client.model;
importmon.User;
/**
*这是QQ客户端,发送用户名和密码
*
**/
publicclassQqClientUser{
//调用客户端连接服务器后台的方法,返回true为成功登录,false为登入失败
publicbooleancheckUser(Useruser){
returnnewQqClientConService().sendLoginInfoToServer(user);
}
}
ClientConServerThread类:
packagecom.qq.client.tools;
importjava.io.ObjectInputStream;
import.Socket;
importcom.qq.client.view.QqChar;
importcom.qq.client.view.QqFriendList;
importmon.Message;
importmon.MessageType;
/**
*这是客户端和服务器保持通讯的线程
**/
publicclassClientConServerThreadimplementsRunnable{
publicSocketclient;
publicClientConServerThread(Socketclient){
this.client=client;
}
@Override
publicvoidrun(){
//不停的读取从服务器发来的消息
while(true){
try{
ObjectInputStreamois=newObjectInputStream(client.getInputStream());
Messagemessage=(Message)ois.readObject();
//判断发来的消息包是否为普通消息包,或者是返回在线好友的包
if(message.getMesType()==MessageType.message_common_mes){
//把从服务器发来的消息显示在聊天界面:
1.从管理聊天窗口的类中取得该窗口2.调用显示方法.
QqCharqqChar=ManageQqChar.getQqChar(message.getGetter()+""+message.getSender());
qqChar.showMessage(message);
}elseif(message.getMesType()==MessageType.message_ret_onLineFriend){
Stringgetter=message.getGetter();
//修改响应的好友列表
QqFriendListqqFriendList=ManageQqFriendList.getQqFriendList(getter);
//更新在线好友
if(qqFriendList!
=null){
qqFriendList.updateFriend(message);
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
ManageClientConServerThread类:
packagecom.qq.client.tools;
importjava.util.HashMap;
importjava.util.Map;
/**
*这是一个管理客户端和服务器保持通讯的线程类
**/
publicclassManageClientConServerThread{
publicstaticMapmap=newHashMap();
//把线程添加到map中
publicstaticvoidaddClientConServerThread(StringuserName,ClientConServerThreadccst){
map.put(userName,ccst);
}
//根据用户名取得该线程
publicstaticClientConServerThreadgetClientConServerThread(StringuserName){
return(ClientConServerThread)map.get(userName);
}
}
ManageQqChar类:
packagecom.qq.client.tools;
importjava.util.HashMap;
importjava.util.Map;
importcom.qq.client.view.QqChar;
/**
*这是一个管理用户聊天界面的类
**/
publicclassManageQqChar{
publicstaticMapmap=newHashMap();
//把用户聊天界面Qqchar添加到map中
publicstaticvoidaddQqChar(StringloginAndFriend,QqCharqqchar){
map.put(loginAndFriend,qqchar);
}
//根据登入用户和发送用户取得该聊天界面
publicstaticQqChargetQqChar(StringloginAndFriend){
return(QqChar)map.get(loginAndFriend);
}
}
ManageQqFriendList类:
packagecom.qq.client.tools;
importjava.util.HashMap;
importjava.util.Map;
importcom.qq.client.view.QqFriendList;
/**
*管理好友、黑名单..界面类
**/
publicclassManageQqFriendList{
publicstaticMapmap=newHashMap();
//把用用户列表类添加到map中
publicstaticvoidaddQqFriendList(StringuserName,QqFriendListlist){
map.put(userName,list);
}
//根据登录用户取得该用户列表类
publicstaticQqFriendListgetQqFriendList(StringuserName){
return(QqFriendList)map.get(userName);
}
}
QqChar类:
packagecom.qq.client.view;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.ObjectOutputStream;
importjava.util.Date;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importcom.qq.client.tools.ManageClientConServerThread;
importmon.Message;
importmon.MessageType;
/**
*QQ聊天窗口
*
**/
publicclassQqCharextendsJFrameimplementsActionListener{
JTextFieldjtf;//输入的文本框
JTextAreajta;//文本区域
JButtonjb;//发送按钮
JPaneljp;//装文本框和发送按钮的panel
Stringfriend;
StringuserName;
publicstaticvoidmain(String[]args){
QqCharqqChar=newQqChar("1","2");
}
publicQqChar(StringuserName,Stringfriend){
this.userName=userName;
this.friend=friend;
jtf=newJTextField(15);
jta=newJTextArea();
jb=newJButton("发送");
jb.addActionListener(this);
jp=newJPanel();
jp.add(jtf);
jp.add(jb);
this.add(jta,"Center");
this.add(jp,"South");
this.setTitle(userName+"正在和"+friend+"聊天");
this.setIconImage(newImageIcon("image/qq.png").getImage());
this.setSize(300,200);
this.setVisible(true);
}
publicvoidshowMessage(Messagemessage){
Stringinfo=message.getSender()+"对"+message.getGetter()+"说:
"+message.getContext()+"\r\n";
this.jta.append(info);
}
@Override
publicvoidactionPerformed(ActionEvente){
//当点击发送按钮时,把消息发送到服务器端
if(e.getSource()==jb){
Messagemessage=newMessage();
message.setMesType(MessageType.message_common_mes);
message.setSender(userName);
message.setGetter(friend);
message.setContext(jtf.getText());
jtf.setText("");
message.setTime(newDate().toString());
try{
ObjectOutputStreamoos=newObjectOutputStream(ManageClientConServerThread.getClientConServerThread(userName).client.getOutputStream());
oos.writeObject(message);
}catch(Exceptione1){
e1.printStackTrace();
}
}
}
}
QqClientLogin类:
importjavax.swing.JLabel;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JPasswordField;
importjavax.swing.JTabbedPane;
importjavax.swing.JTextField;
importcom.qq.client.model.QqClientUser;
importcom.qq.client.tools.ManageClientConServerThread;
importcom.qq.client.tools.ManageQqFriendList;
importmon.Message;
importmon.MessageType;
importmon.User;
/**
*QQ客户端登入窗口
*
**/
publicclassQqClientLoginextendsJFrameimplementsActionListener{
//定义北部组件
JLabeljbl1;
//定义中部组件:
其中中部组件有一个选项卡的窗口管理,有三个JPanel,一个文本框,一个密码框,4个JLabel,一个清除号码按钮,两个多选框
JTabbedPanejtp;//选项卡窗口
JPaneljp2;//QQ号码
JPaneljp3;//手机号码
JPaneljp4;//电子邮件
JLabeljp2_jpl1;//QQ号码
JLabeljp2_jpl2;//QQ密码
JLabeljp2_jpl3;//忘记密码
JLabeljp2_jpl4;//申请密码保护
JButtonjp2_jb1;//清除号码
JTextFieldjp2_jtf;//文本框
JPasswordFieldjp2_jpf;//密码框
JCheckBoxjp2_jcb1;//隐身登入
JCheckBoxjp2_jcb2;//记住密码
//定义南部组件
JPaneljp1;
JButtonjp1_jb1;//登入按钮
JButtonjp1_jb2;//取消按钮
JButtonjp1_jb3;//注册向导按钮
publicstaticvoidmain(String[]args){
QqClientLoginqqClientLogin=newQqClientLogin();
}
publicQqClientLogin(){
//处理北部的组件
jbl1=newJLabel(newImageIcon("image/beibu.gif"));
//处理中部的组件
jp2=newJPanel(newGridLayout(3,3));//把中部分成三行三列
jp2_jpl1=newJLabel("QQ号码",JLabel.CENTER);
jp2_jpl2=newJLabel("QQ密码",JLabel.CENTER);
jp2_jpl3=newJLabel("忘记密码",JLabel.CENTER);
jp2_jpl3.setForeground(Color.blue);//把忘记密码设为蓝色
jp2_jpl4=newJLabel("申请密码保护",JLabel.CENTER);
jp2_jb1=newJButton(newImageIcon("image/clear.png"));
jp2_jtf=newJTextField();
jp2_jpf=newJPasswordField();
jp2_jcb1=newJCheckBox("隐身登入");
jp2_jcb2=newJCheckBox("记住密码");
//把控件按照顺序加入到jp2
jp2.add(jp2_jpl1);
jp2.add(jp2_jtf);
jp2.add(jp2_jb1);
jp2.add(jp2_jpl2);
jp2.add(jp2_jpf);
jp2.add(jp2_jpl3);
jp2.add(jp2_jcb1);
jp2.add(jp2_jcb2);
jp2.add(jp2_jpl4);
//创建选项卡窗口,把三个JPanel放进去,最后把选项卡放进JFrame中
jtp=newJTabbedPane();
jtp.add("QQ号码",jp2);
jp3=newJPanel();
jtp.add("手机号码",jp3);
jp4=newJPanel();
jtp.add("电子邮件",jp4);
//处理南部的组件
jp1=newJPanel();
jp1_jb1=newJButton(newImageIcon("image/dengru.png"));
jp1_jb1.addActionListener(this);
jp1_jb2=newJButton(newImageIcon("image/quxiao.png"));
jp1_jb3=newJButton(newImageIcon("image/xiangdao.png"));
//把三个按钮放进jp1中
jp1.add(jp1_jb1);
jp1.add(jp1_jb2);
jp1.add(jp1_jb3);
//把定义好的组件放入到JFrame中
this.add(jbl1,"North");//放入北部组件
this.add(jp1,"South");//放入南部组件
this.add(jtp,"Center");//放入中部组件
//定义JFrame的一些属性
this.setSize(350,240);