韩顺平java视频案例(山寨版QQ)源代码

上传人:沈*** 文档编号:77822084 上传时间:2022-04-20 格式:DOC 页数:27 大小:203KB
收藏 版权申诉 举报 下载
韩顺平java视频案例(山寨版QQ)源代码_第1页
第1页 / 共27页
韩顺平java视频案例(山寨版QQ)源代码_第2页
第2页 / 共27页
韩顺平java视频案例(山寨版QQ)源代码_第3页
第3页 / 共27页
资源描述:

《韩顺平java视频案例(山寨版QQ)源代码》由会员分享,可在线阅读,更多相关《韩顺平java视频案例(山寨版QQ)源代码(27页珍藏版)》请在装配图网上搜索。

1、文库里没有关于山寨QQ的java的源代码,只能看了视频整理自己写了,特免费分享。文档说明:根据java教学视频韩顺平.循序渐进学.java.从入门到精通(第8794讲)整理得源相关代码。代码调试无误,下载后调试有误的可评论留言联系。image中图片附录在源代码后面。工程文件夹:(源代码)/* * 这是客户端连接服务器的后台 */package com.qq.client.model;import com.qq.client.tools.*;import java.util.*;import .*;import java.io.*;import mon.*;public class QqClie

2、ntConServer public Socket s;/发送第一次请求public boolean sendLoginInfoToServer(Object o)boolean b=false;try /System.out.println(kk);s=new Socket(127.0.0.1,9988);ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream();oos.writeObject(o);ObjectInputStream ois=new ObjectInputStream(s.getInputStream

3、();Message ms=(Message)ois.readObject();/这里就是验证用户登录的地方if(ms.getMesType().equals(1)/就创建一个该qq号和服务器端保持通讯连接得线程ClientConServerThread ccst=new ClientConServerThread(s);/启动该通讯线程ccst.start();ManageClientConServerThread.addClientConServerThread(User)o).getUserId(), ccst);b=true;else/关闭Scokets.close(); catch

4、(Exception e) e.printStackTrace();/ TODO: handle exceptionfinallyreturn b;public void SendInfoToServer(Object o)/*try Socket s=new Socket(127.0.0.1,9999); catch (Exception e) e.printStackTrace();/ TODO: handle exceptionfinally*/package com.qq.client.model;import mon.*;public class QqClientUser publi

5、c boolean checkUser(User u)return new QqClientConServer().sendLoginInfoToServer(u);/* * 这是客户端和服务器端保持通讯的线程. */package com.qq.client.tools;import java.io.*;import .*;import com.qq.client.view.QqChat;import com.qq.client.view.QqFriendList;import mon.*;public class ClientConServerThread extends Thread p

6、rivate Socket s;/构造函数public ClientConServerThread(Socket s)this.s=s;public void run()while(true)/不停的读取从服务器端发来的消息try ObjectInputStream ois=new ObjectInputStream(s.getInputStream();Message m=(Message)ois.readObject();System.out.println(读取到从服务发来的消息+ m.getSender() + 给 +m.getGetter()+ 内容+m.getCon();if(m.

7、getMesType().equals(MessageType.message_comm_mes)/把从服务器获得消息,显示到该显示的聊天界面QqChat qqChat=ManageQqChat.getQqChat(m.getGetter()+ +m.getSender();/显示qqChat.showMessage(m);else if(m.getMesType().equals(MessageType.message_ret_onLineFriend)System.out.println(客户端接收到+m.getCon();String con=m.getCon();String frie

8、nds=con.split( );String getter=m.getGetter();System.out.println(getter=+getter);/修改相应的好友列表.QqFriendList qqFriendList=ManageQqFriendList.getQqFriendList(getter);/if(qqFriendList)/更新在线好友.if(qqFriendList!=null)qqFriendList.upateFriend(m); catch (Exception e) e.printStackTrace();/ TODO: handle exception

9、public Socket getS() return s;public void setS(Socket s) this.s = s;/* * 这是一个管理客户端和服务器保持通讯的线程类 */package com.qq.client.tools;import java.util.*;public class ManageClientConServerThread private static HashMap hm=new HashMap();/把创建好的ClientConServerThread放入到hmpublic static void addClientConServerThread

10、(String qqId,ClientConServerThread ccst)hm.put(qqId, ccst);/可以通过qqId取得该线程 public static ClientConServerThread getClientConServerThread(String qqId)return (ClientConServerThread)hm.get(qqId);/* * 这是一个管理用户聊天界面的类 */package com.qq.client.tools;import java.util.*;import com.qq.client.view.*;public class

11、ManageQqChat private static HashMap hm=new HashMap();/加入public static void addQqChat(String loginIdAnFriendId,QqChat qqChat)hm.put(loginIdAnFriendId, qqChat);/取出public static QqChat getQqChat(String loginIdAnFriendId )return (QqChat)hm.get(loginIdAnFriendId);/* * 管理好友、黑名单.界面类 */package com.qq.client

12、.tools;import java.util.*;import java.io.*;import com.qq.client.view.*;public class ManageQqFriendList private static HashMap hm=new HashMap();public static void addQqFriendList(String qqid,QqFriendList qqFriendList)hm.put(qqid, qqFriendList);public static QqFriendList getQqFriendList(String qqId)re

13、turn (QqFriendList)hm.get(qqId);/* * 这是与好友聊天的界面 * 因为客户端,要处于读取的状态,因此我们把它做成一个线程 */package com.qq.client.view;import com.qq.client.tools.*;import com.qq.client.model.*;import mon.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;public class QqChat extends JFrame impleme

14、nts ActionListenerJTextArea jta;JTextField jtf;JButton jb;JPanel jp;String ownerId;String friendId;public static void main(String args) / TODO Auto-generated method stub/QqChat qqChat=new QqChat(1);public QqChat(String ownerId,String friend)this.ownerId=ownerId;this.friendId=friend;jta=new JTextArea

15、();jtf=new JTextField(15);jb=new JButton(发送);jb.addActionListener(this);jp=new JPanel();jp.add(jtf);jp.add(jb);this.add(jta,Center);this.add(jp,South);this.setTitle(ownerId+ 正在和 +friend+ 聊天);this.setIconImage(new ImageIcon(image/qq.gif).getImage();this.setSize(300, 200);this.setVisible(true);/写一个方法,

16、让它显示消息public void showMessage(Message m)String info=m.getSender()+ 对 +m.getGetter()+ 说:+m.getCon()+rn;this.jta.append(info);public void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubif(arg0.getSource()=jb)/如果用户点击了,发送按钮Message m=new Message();m.setMesType(MessageType.message_comm

17、_mes); /!最后一步m.setSender(this.ownerId);m.setGetter(this.friendId);m.setCon(jtf.getText();m.setSendTime(new java.util.Date().toString();/发送给服务器.try ObjectOutputStream oos=new ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream();oos.writeObject(m);

18、catch (Exception e) e.printStackTrace();/ TODO: handle exception/public void run() / TODO Auto-generated method stub/while(true)/try /读取如果读不到就等待./ObjectInputStream ois=new ObjectInputStream(QqClientConServer.s.getInputStream();/Message m=(Message)ois.readObject();/显示/String info=m.getSender()+ 对 +m.

19、getGetter()+ 说:+m.getCon()+rn;/this.jta.append(info);/ catch (Exception e) /e.printStackTrace();/ TODO: handle exception/* * 功能:qq客户端登录界面 */package com.qq.client.view;import mon.*;import com.qq.client.tools.*;import java.io.*;import javax.swing.*;import com.qq.client.model.QqClientUser;import mon.Us

20、er;import java.awt.*;import java.awt.event.*;public class QqClientLogin extends JFrame implements ActionListener/定义北部需要的组件JLabel jbl1;/定义中部需要的组件/.中部有三个JPanel,有一个叫选项卡窗口管理JTabbedPane jtp;JPanel jp2,jp3,jp4;JLabel jp2_jbl1,jp2_jbl2,jp2_jbl3,jp2_jbl4;JButton jp2_jb1;JTextField jp2_jtf;JPasswordField jp2

21、_jpf;JCheckBox jp2_jcb1,jp2_jcb2;/定义南部需要的组件JPanel jp1;JButton jp1_jb1,jp1_jb2,jp1_jb3;public static void main(String args) / TODO Auto-generated method stubQqClientLogin qqClientLogin=new QqClientLogin();public QqClientLogin()/处理北部jbl1=new JLabel(new ImageIcon(image/tou.gif);/处理中部jp2=new JPanel(new

22、GridLayout(3,3);jp2_jbl1=new JLabel(QQ号码,JLabel.CENTER);jp2_jbl2=new JLabel(QQ密码,JLabel.CENTER);jp2_jbl3=new JLabel(忘记密码,JLabel.CENTER);jp2_jbl3.setForeground(Color.blue);jp2_jbl4=new JLabel(申请密码保护,JLabel.CENTER);jp2_jb1=new JButton(new ImageIcon(image/clear.gif);jp2_jtf=new JTextField();jp2_jpf=new

23、 JPasswordField();jp2_jcb1=new JCheckBox(隐身登录);jp2_jcb2=new JCheckBox(记住密码);/把控件按照顺序加入到jp2jp2.add(jp2_jbl1);jp2.add(jp2_jtf);jp2.add(jp2_jb1);jp2.add(jp2_jbl2);jp2.add(jp2_jpf);jp2.add(jp2_jbl3);jp2.add(jp2_jcb1);jp2.add(jp2_jcb2);jp2.add(jp2_jbl4);/创建选项卡窗口jtp=new JTabbedPane();jtp.add(QQ号码,jp2);jp3

24、= new JPanel();jtp.add(手机号码,jp3);jp4=new JPanel();jtp.add(电子邮件,jp4);/处理南部jp1=new JPanel();jp1_jb1=new JButton(new ImageIcon(image/denglu.gif);/响应用户点击登录jp1_jb1.addActionListener(this);jp1_jb2=new JButton(new ImageIcon(image/quxiao.gif);jp1_jb3=new JButton(new ImageIcon(image/xiangdao.gif);/把三个按钮放入到jp

25、1jp1.add(jp1_jb1);jp1.add(jp1_jb2);jp1.add(jp1_jb3);this.add(jbl1,North);this.add(jtp,Center);/.把jp1放在南部this.add(jp1,South);this.setSize(350, 240);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);public void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stub

26、/如果用户点击登录if(arg0.getSource()=jp1_jb1)QqClientUser qqClientUser=new QqClientUser();User u=new User();u.setUserId(jp2_jtf.getText().trim();u.setPasswd(new String(jp2_jpf.getPassword();if(qqClientUser.checkUser(u)try /把创建好友列表的语句提前.QqFriendList qqList = new QqFriendList(u.getUserId();ManageQqFriendList.

27、addQqFriendList(u.getUserId(), qqList);/发送一个要求返回在线好友的请求包.ObjectOutputStream oos=new ObjectOutputStream(ManageClientConServerThread.getClientConServerThread(u.getUserId().getS().getOutputStream();/做一个MessageMessage m=new Message();m.setMesType(MessageType.message_get_onLineFriend);/指明我要的是这个qq号的好友情况.m

28、.setSender(u.getUserId();oos.writeObject(m); catch (Exception e) e.printStackTrace();/ TODO: handle exception/关闭掉登录界面this.dispose();elseJOptionPane.showMessageDialog(this,用户名密码错误);/* * 我的好友列表,(也包括陌生人,黑名单) */package com.qq.client.view;import com.qq.client.tools.*;import mon.Message;import javax.swing

29、.*;import java.awt.*;import java.awt.event.*;public class QqFriendList extends JFrame implements ActionListener,MouseListener/处理第一张卡片.JPanel jphy1,jphy2,jphy3;JButton jphy_jb1,jphy_jb2,jphy_jb3;JScrollPane jsp1;String owner;/处理第二张卡片(陌生人).JPanel jpmsr1,jpmsr2,jpmsr3;JButton jpmsr_jb1,jpmsr_jb2,jpmsr_

30、jb3;JScrollPane jsp2;JLabel jb1s;/把整个JFrame设置成CardLayoutCardLayout cl;public static void main(String args) / TODO Auto-generated method stub/QqFriendList qqFriendList=new QqFriendList();/更新在线的好友情况public void upateFriend(Message m)String onLineFriend=m.getCon().split( );for(int i=0;ionLineFriend.leng

31、th;i+)jb1sInteger.parseInt(onLineFriendi)-1.setEnabled(true);public QqFriendList(String ownerId)this.owner=ownerId;/处理第一张卡片(显示好友列表)jphy_jb1=new JButton(我的好友);jphy_jb2=new JButton(陌生人);jphy_jb2.addActionListener(this);jphy_jb3=new JButton(黑名单);jphy1=new JPanel(new BorderLayout();/假定有50个好友jphy2=new JP

32、anel(new GridLayout(50,1,4,4);/给jphy2,初始化50好友.jb1s =new JLabel50;for(int i=0;ijb1s.length;i+)jb1si=new JLabel(i+1+,new ImageIcon(image/mm.jpg),JLabel.LEFT);jb1si.setEnabled(false);if(jb1si.getText().equals(ownerId)jb1si.setEnabled(true);jb1si.addMouseListener(this);jphy2.add(jb1si);jphy3=new JPanel(

33、new GridLayout(2,1);/把两个按钮加入到jphy3jphy3.add(jphy_jb2);jphy3.add(jphy_jb3);jsp1=new JScrollPane(jphy2);/对jphy1,初始化jphy1.add(jphy_jb1,North);jphy1.add(jsp1,Center);jphy1.add(jphy3,South);/处理第二张卡片jpmsr_jb1=new JButton(我的好友);jpmsr_jb1.addActionListener(this);jpmsr_jb2=new JButton(陌生人);jpmsr_jb3=new JBut

34、ton(黑名单);jpmsr1=new JPanel(new BorderLayout();/假定有20个陌生人jpmsr2=new JPanel(new GridLayout(20,1,4,4);/给jphy2,初始化20陌生人.JLabel jb1s2=new JLabel20;for(int i=0;ijb1s2.length;i+)jb1s2i=new JLabel(i+1+,new ImageIcon(image/mm.jpg),JLabel.LEFT);jpmsr2.add(jb1s2i);jpmsr3=new JPanel(new GridLayout(2,1);/把两个按钮加入

35、到jphy3jpmsr3.add(jpmsr_jb1);jpmsr3.add(jpmsr_jb2);jsp2=new JScrollPane(jpmsr2);/对jphy1,初始化jpmsr1.add(jpmsr3,North);jpmsr1.add(jsp2,Center);jpmsr1.add(jpmsr_jb3,South);cl=new CardLayout();this.setLayout(cl);this.add(jphy1,1);this.add(jpmsr1,2);/在窗口显示自己的编号.this.setTitle(ownerId);this.setSize(250, 600)

36、;this.setVisible(true);public void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stub/如果点击了陌生人按钮,就显示第二张卡片if(arg0.getSource()=jphy_jb2)cl.show(this.getContentPane(), 2);else if(arg0.getSource()=jpmsr_jb1)cl.show(this.getContentPane(), 1);public void mouseClicked(MouseEvent arg0) / TO

37、DO Auto-generated method stub/响应用户双击的事件,并得到好友的编号.if(arg0.getClickCount()=2)/得到该好友的编号String friendNo=(JLabel)arg0.getSource().getText();/System.out.println(你希望和 +friendNo+ 聊天);QqChat qqChat=new QqChat(this.owner,friendNo);/把聊天界面加入到管理类ManageQqChat.addQqChat(this.owner+ +friendNo, qqChat);public void m

38、ouseEntered(MouseEvent arg0) / TODO Auto-generated method stubJLabel jl=(JLabel)arg0.getSource();jl.setForeground(Color.red);public void mouseExited(MouseEvent arg0) / TODO Auto-generated method stubJLabel jl=(JLabel)arg0.getSource();jl.setForeground(Color.black);public void mousePressed(MouseEvent

39、arg0) / TODO Auto-generated method stubpublic void mouseReleased(MouseEvent arg0) / TODO Auto-generated method stubpackage mon;public class Message implements java.io.Serializableprivate String mesType;private String sender;private String getter;private String con;private String sendTime;public Stri

40、ng getSender() return sender;public void setSender(String sender) this.sender = sender;public String getGetter() return getter;public void setGetter(String getter) this.getter = getter;public String getCon() return con;public void setCon(String con) this.con = con;public String getSendTime() return

41、sendTime;public void setSendTime(String sendTime) this.sendTime = sendTime;public String getMesType() return mesType;public void setMesType(String mesType) this.mesType = mesType;/* * 定义包的种类 */package mon;public interface MessageType String message_succeed=1;/表明是登陆成功String message_login_fail=2;/表明登录

42、失败String message_comm_mes=3;/普通信息包String message_get_onLineFriend=4;/要求在线好友的包String message_ret_onLineFriend=5;/返回在线好友的包/* * 这是用户信息类 */package mon;public class User implements java.io.Serializable private String userId;private String passwd;public String getUserId() return userId;public void setUser

43、Id(String userId) this.userId = userId;public String getPasswd() return passwd;public void setPasswd(String passwd) this.passwd = passwd;package mon;public class Message implements java.io.Serializableprivate String mesType;private String sender;private String getter;private String con;private Strin

44、g sendTime;public String getSender() return sender;public void setSender(String sender) this.sender = sender;public String getGetter() return getter;public void setGetter(String getter) this.getter = getter;public String getCon() return con;public void setCon(String con) this.con = con;public String

45、 getSendTime() return sendTime;public void setSendTime(String sendTime) this.sendTime = sendTime;public String getMesType() return mesType;public void setMesType(String mesType) this.mesType = mesType;/* * 定义包的种类 */package mon;public interface MessageType String message_succeed=1;/表明是登陆成功String mess

46、age_login_fail=2;/表明登录失败String message_comm_mes=3;/普通信息包String message_get_onLineFriend=4;/要求在线好友的包String message_ret_onLineFriend=5;/返回在线好友的包/* * 这是用户信息类 */package mon;public class User implements java.io.Serializable private String userId;private String passwd;public String getUserId() return user

47、Id;public void setUserId(String userId) this.userId = userId;public String getPasswd() return passwd;public void setPasswd(String passwd) this.passwd = passwd;package com.qq.server.model;import java.util.*;public class ManageClientThread public static HashMap hm=new HashMap();/向hm中添加一个客户端通讯线程public

48、static void addClientThread(String uid,SerConClientThread ct)hm.put(uid, ct);public static SerConClientThread getClientThread(String uid)return (SerConClientThread)hm.get(uid);/返回当前在线的人的情况public static String getAllOnLineUserid()/使用迭代器完成Iterator it=hm.keySet().iterator();String res=;while(it.hasNext

49、()res+=it.next().toString()+ ;return res;/* * 这是qq服务器,它在监听,等待某个qq客户端,来连接 */package com.qq.server.model;import mon.*;import .*;import java.io.*;import java.util.*;public class MyQqServer public MyQqServer()try /在9999监听System.out.println(我是服务器,在9988监听);ServerSocket ss=new ServerSocket(9988);/阻塞,等待连接wh

50、ile(true)Socket s=ss.accept();/接收客户端发来的信息.ObjectInputStream ois=new ObjectInputStream(s.getInputStream();User u=(User)ois.readObject();System.out.println(服务器接收到用户id:+u.getUserId()+ 密码:+u.getPasswd();Message m=new Message();ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream();if(u.getPas

51、swd().equals(1)/返回一个成功登陆的信息报m.setMesType(1);oos.writeObject(m);/这里就单开一个线程,让该线程与该客户端保持通讯.SerConClientThread scct=new SerConClientThread(s);ManageClientThread.addClientThread(u.getUserId(), scct);/启动与该客户端通信的线程.scct.start();/并通知其它在线用户.scct.notifyOther(u.getUserId();elsem.setMesType(2);oos.writeObject(m);/关闭Sockets.close(); catch (Exception e) e.printStackTrace();/ TODO: handle exceptionfinally/* * 功能:是服务器和某个客户端的通信线程 */package com.qq.server.model;import java.util.*;import .*;import java.io.*;im

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!