山寨QQ韩顺平版.docx

上传人:b****6 文档编号:7789023 上传时间:2023-01-26 格式:DOCX 页数:33 大小:67.20KB
下载 相关 举报
山寨QQ韩顺平版.docx_第1页
第1页 / 共33页
山寨QQ韩顺平版.docx_第2页
第2页 / 共33页
山寨QQ韩顺平版.docx_第3页
第3页 / 共33页
山寨QQ韩顺平版.docx_第4页
第4页 / 共33页
山寨QQ韩顺平版.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

山寨QQ韩顺平版.docx

《山寨QQ韩顺平版.docx》由会员分享,可在线阅读,更多相关《山寨QQ韩顺平版.docx(33页珍藏版)》请在冰豆网上搜索。

山寨QQ韩顺平版.docx

山寨QQ韩顺平版

这是一个简单的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);

this.

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

当前位置:首页 > 求职职场 > 简历

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

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