/*** 这是服务器端的控制界面,可以完成启动服务器,关闭服务器* 可以管理和监控用户.*/
package com.qq.server.view;import javax.swing.*;import com.qq.server.model.MyQqServer;import java.awt.*;
import java.awt.event.*;
public class MyServerFrame extends JFrame implements ActionListener {JPanel jp1;JButton jb1,jb2;public static void main(String[] args) {// TODO Auto-generated method stubMyServerFrame mysf=new MyServerFrame();}public MyServerFrame(){jp1=new JPanel();jb1=new JButton("启动服务器");jb1.addActionListener(this);jb2=new JButton("关闭服务器");jp1.add(jb1);jp1.add(jb2);this.add(jp1);this.setSize(500, 400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(arg0.getSource()==jb1){new MyQqServer();}}}

/*** 这是服务器端的控制界面,可以完成启动服务器,关闭服务器* 可以管理和监控用户.*/
package com.qq.server.view;import javax.swing.*;import com.qq.server.model.MyQqServer;import java.awt.*;
import java.awt.event.*;
public class MyServerFrame extends JFrame implements ActionListener {JPanel jp1;JButton jb1,jb2;public static void main(String[] args) {// TODO Auto-generated method stubMyServerFrame mysf=new MyServerFrame();}public MyServerFrame(){jp1=new JPanel();jb1=new JButton("启动服务器");jb1.addActionListener(this);jb2=new JButton("关闭服务器");jp1.add(jb1);jp1.add(jb2);this.add(jp1);this.setSize(500, 400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubif(arg0.getSource()==jb1){new MyQqServer();}}}
/*** 定义消息包的种类*/
package com.qq.common;public interface MessageType {String message_succeed="1";//表明是登陆成功String message_login_fail="2";//表明登录失败String message_comm_mes="3";//普通信息包String message_get_onLineFriend="4";//要求在线好友的包String message_ret_onLineFriend="5";//返回在线好友的包
}
/*** 服务器端存储的这是用户信息类*/
package com.qq.common;public class User implements java.io.Serializable {private String userId;private String passwd;public String getUserId() {return userId;}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<String, SerConClientThread>();//向hm中添加一个客户端通讯线程public 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()){res+=it.next().toString()+" ";}return res;}
}
/*** 这是qq服务器,它在监听,等待某个qq客户端,来连接*/
package com.qq.server.model;
import com.qq.common.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class MyQqServer {public MyQqServer(){try {//在9999监听System.out.println("我是服务器,在9999监听");ServerSocket ss=new ServerSocket(9999);//阻塞,等待连接while(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.getPasswd().equals("123456")){//返回一个成功登陆的信息报m.setMesType("1");oos.writeObject(m);//这里就单开一个线程,让该线程与该客户端保持通讯.SerConClientThread scct=new SerConClientThread(s);ManageClientThread.addClientThread(u.getUserId(), scct);//启动与该客户端通信的线程.scct.start();//并通知其它在线用户.scct.notifyOther(u.getUserId());}else{m.setMesType("2");oos.writeObject(m);//关闭Sockets.close();}} } catch (Exception e) {e.printStackTrace();// TODO: handle exception}finally{}}}
/*** 功能:是服务器和某个客户端的通信线程*/
package com.qq.server.model;import java.util.*;
import java.net.*;
import java.io.*;
import com.qq.common.*;
public class SerConClientThread  extends Thread{Socket s;public SerConClientThread(Socket s){//把服务器和该客户端的连接赋给sthis.s=s;}//让该线程去通知其它用户public void notifyOther(String iam){//得到所有在线的人的线程HashMap hm=ManageClientThread.hm;Iterator it=hm.keySet().iterator();while(it.hasNext()){Message m=new Message();m.setCon(iam);m.setMesType(MessageType.message_ret_onLineFriend);//取出在线人的idString onLineUserId=it.next().toString();try {ObjectOutputStream oos=new ObjectOutputStream(ManageClientThread.getClientThread(onLineUserId).s.getOutputStream());m.setGetter(onLineUserId);oos.writeObject(m);} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}}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.getMesType().equals(MessageType.message_comm_mes)){//一会完成转发.//取得接收人的通信线程SerConClientThread sc=ManageClientThread.getClientThread(m.getGetter());ObjectOutputStream oos=new ObjectOutputStream(sc.s.getOutputStream());oos.writeObject(m);}else if(m.getMesType().equals(MessageType.message_get_onLineFriend)){System.out.println(m.getSender()+" 要他的好友");//把在服务器的好友给该客户端返回.String res=ManageClientThread.getAllOnLineUserid();Message m2=new Message();m2.setMesType(MessageType.message_ret_onLineFriend);m2.setCon(res);m2.setGetter(m.getSender());ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());oos.writeObject(m2);}} catch (Exception e) {e.printStackTrace();// TODO: handle exception}}}
}

分割线-----------
客户端

/*** 功能:qq客户端登录界面*/
package com.qq.client.view;
import com.qq.common.*;
import com.qq.client.tools.*;
import java.io.*;
import javax.swing.*;import com.qq.client.model.QqClientUser;
import com.qq.common.User;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_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 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 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= 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"));//把三个按钮放入到jp1jp1.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//如果用户点击登录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.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.setSender(u.getUserId());oos.writeObject(m);} catch (Exception e) {e.printStackTrace();// TODO: handle exception}//关闭掉登录界面this.dispose();}else{JOptionPane.showMessageDialog(this,"用户名密码错误");}}}}

/*** 我的好友列表,(也包括陌生人,黑名单)*/
package com.qq.client.view;import com.qq.client.tools.*;
import com.qq.common.Message;import javax.swing.*;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_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;i<onLineFriend.length;i++){jb1s[Integer.parseInt(onLineFriend[i])-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 JPanel(new GridLayout(50,1,4,4));//给jphy2,初始化50好友.jb1s =new JLabel[50];for(int i=0;i<jb1s.length;i++){jb1s[i]=new JLabel(i+1+"",new ImageIcon("image/mm.jpg"),JLabel.LEFT);jb1s[i].setEnabled(false);if(jb1s[i].getText().equals(ownerId)){jb1s[i].setEnabled(true);}jb1s[i].addMouseListener(this);jphy2.add(jb1s[i]);}jphy3=new JPanel(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 JButton("黑名单");jpmsr1=new JPanel(new BorderLayout());//假定有20个陌生人jpmsr2=new JPanel(new GridLayout(20,1,4,4));//给jphy2,初始化20陌生人.JLabel []jb1s2=new JLabel[20];for(int i=0;i<jb1s2.length;i++){jb1s2[i]=new JLabel(i+1+"",new ImageIcon("image/mm.jpg"),JLabel.LEFT);jpmsr2.add(jb1s2[i]);}jpmsr3=new JPanel(new GridLayout(2,1));//把两个按钮加入到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(140, 400);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) {// TODO 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 mouseEntered(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 arg0) {// TODO Auto-generated method stub}public void mouseReleased(MouseEvent arg0) {// TODO Auto-generated method stub}}

/*** 这是与好友聊天的界面* 因为客户端,要处于读取的状态,因此我们把它做成一个线程*/
package com.qq.client.view;import com.qq.client.tools.*;
import com.qq.client.model.*;
import com.qq.common.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class QqChat extends JFrame implements ActionListener{JTextArea 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();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);}//写一个方法,让它显示消息public void showMessage(Message m){String info=m.getSender()+" 对 "+m.getGetter()+" 说:"+m.getCon()+"\r\n";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_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);} 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.getGetter()+" 说:"+m.getCon()+"\r\n";
//              this.jta.append(info);
//
//
//
//          } catch (Exception e) {//              e.printStackTrace();
//              // TODO: handle exception
//          }
//
//
//
//      }
//
//  }}

package com.qq.common;public class Message implements java.io.Serializable{private String mesType;private String sender;private String getter;private String con;private String 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 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 com.qq.common;public interface MessageType {String message_succeed="1";//表明是登陆成功String message_login_fail="2";//表明登录失败String message_comm_mes="3";//普通信息包String message_get_onLineFriend="4";//要求在线好友的包String message_ret_onLineFriend="5";//返回在线好友的包
}
/*** 这是用户信息类*/
package com.qq.common;public class User implements java.io.Serializable {private String userId;private String passwd;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getPasswd() {return passwd;}public void setPasswd(String passwd) {this.passwd = passwd;}
}
/*** 这是客户端连接服务器的后台*/
package com.qq.client.model;
import com.qq.client.tools.*;
import java.util.*;
import java.net.*;
import java.io.*;
import com.qq.common.*;
public class QqClientConServer {public  Socket s;//发送第一次请求public boolean sendLoginInfoToServer(Object o){boolean b=false;try {System.out.println("kk");s=new Socket("127.0.0.1",9999);ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());oos.writeObject(o);ObjectInputStream ois=new ObjectInputStream(s.getInputStream());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 (Exception e) {e.printStackTrace();// TODO: handle exception}finally{}return b;}public void SendInfoToServer(Object o){/*try {Socket s=new Socket("127.0.0.1",9999);} catch (Exception e) {e.printStackTrace();// TODO: handle exception}finally{}*/}
}
package com.qq.client.model;import com.qq.common.*;
public class QqClientUser {public boolean checkUser(User u){return new QqClientConServer().sendLoginInfoToServer(u);}}
/*** 这是客户端和服务器端保持通讯的线程.*/
package com.qq.client.tools;import java.io.*;
import java.net.*;import com.qq.client.view.QqChat;
import com.qq.client.view.QqFriendList;
import com.qq.common.*;
public class ClientConServerThread extends Thread {private 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.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 friends[]=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}}}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<String, ClientConServerThread>();//把创建好的ClientConServerThread放入到hmpublic static void addClientConServerThread(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 ManageQqChat {private static HashMap hm=new HashMap<String, QqChat>();//加入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.tools;import java.util.*;
import java.io.*;
import com.qq.client.view.*;
public class ManageQqFriendList {private static HashMap hm=new HashMap<String, QqFriendList>();public static void addQqFriendList(String qqid,QqFriendList qqFriendList){hm.put(qqid, qqFriendList);}public static QqFriendList getQqFriendList(String qqId){return (QqFriendList)hm.get(qqId);}
}

CopyQq program山寨QQ项目相关推荐

  1. JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示

    遇到的问题: 现在每登录一个人,后面的人是能看到前面的登录的人的: 但是,前面的人看不到后面的人登录: //后面每登录一个人,有责任去通知前面登录的人他已经上线了: 通知了完以后,需要更改好友在线的情 ...

  2. 微博是这样炼成的:山寨QQ项目源码下载大全~

    晕,CSDN不能上传,请到我javaEye的博客上下载:javaFound.javaEye.com

  3. 新手用WPF山寨QQ管家7.6(三)

    由于一直忙工作,没有更新完博客,更可恨的是...在清理资料的时候不小心删除了之前自己做的各种效果的DEMO....好在项目中用到了大部分,也算有所保留,以后可不敢随便删东西了....太可怕了! 在 新 ...

  4. java三层 开源_java 山寨qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源...

    [实例简介] java 山寨qq 聊天工具(基于mvc三层架构,附 mvc架构模式pdf说明文档)支持开源 [实例截图] [核心代码] java山寨qq聊天工具(基于mvc三层架构,附mvc架构模式p ...

  5. java qq项目_Java版QQ项目

    Java版QQ项目详细设计之:概述 2012-03-16 10:40 wangchangshuai0010 wangchangshuai0010的博客 前两天在博客上,发了一篇博文,概述了java q ...

  6. 百分百用Java se写QQ项目的整体设计思想(swing)

    QQ项目整体设计思想 QQ项目简单的需求分析 Java se写QQ项目所设计的技术 1.客户端 2.服务器 数据库 开发工具 QQ项目的流程图 QQ项目具体功能的分析 QQ项目整体的框架图 下期更新 ...

  7. 精简QQ项目交流总结

    前段时间花了不少时间搞了一个较简单的QQ项目,这里把它发布出来分型给大家学习探讨. 目前为止该QQ项目实现如下功能:添加好友到好友列表,可以把好友在不同分类中移动,同时支持离线查找添加好友,离线更换头 ...

  8. Java实现伪QQ项目

    java程序设计实验报告 文章目录 java程序设计实验报告 实验环境: 实验目的: 实验内容: 实验步骤: 一.实验预处理 二.登录界面 实现登录界面的代码为: 三.好友界面 实现好友界面的代码为: ...

  9. java山寨qq_java图形界面之 山寨QQ登陆界面

    要山寨出QQ登陆界面,首先要对java的图形界面有一定的了解.在jdk1.4之前,图形界面所用到的所有类和接口都在javax.awt之下,在其之后就都在javax.swing里了. 关于图形界面的开发 ...

  10. java版QQ项目 源代码共享

    最近总有人联系我要java 版QQ源代码,当然你想学习,我不会拒绝给你,请拿到源代码的朋友,认真阅读一下,同时我想对要源代码的朋友提出几点要求,希望大家认真看一下: 1.我写的这个QQ虽然不是很完善, ...

最新文章

  1. CAS SSO 单点登录 实例
  2. Debug类和Trace类的区别
  3. 求平方根sqrt()函数的底层算法效率问题
  4. 【linux 开发】定时器使用setitimer
  5. java第一次上机_java第一次上机实验--验证码
  6. mysql 分表分库mycat_Mysql数据库之如何Mycat分表分库?
  7. python classmethod 与 staticmethod
  8. 自己创建DXperience的本地资源文件
  9. 做一个自己的PC微信无感免打扰检测僵尸粉死粉的小工具。使用c++ call
  10. TCP和UDP的区别和优缺点
  11. 微信图片怎么添加竖排文字_微信拍照的照片怎样加文字?
  12. 实用干货!正交试验设计及极差分析步骤总结!
  13. python使用matplotlib 画柱状图代码_Python 使用 matplotlib 画柱状图教程
  14. 从0到1万字贴心讲解单体架构到分布式架构的演变(第一篇)
  15. TDengineGUI无法连接TDengine
  16. Spark—15分钟教程
  17. 如何编写一个Java帮助文档
  18. wordpress谷歌字体_适用于WordPress网站的10种性能最高的Google AdSense标语尺寸和格式
  19. 苹果iOS系统最新市占率统计:iOS 11份额达到52%
  20. 特征缩放+无量纲化:最小最大缩放 - Python代码实现

热门文章

  1. IT人 不要一辈子靠技术生存(转
  2. 一篇文章掌握MySQL事务的四大特性
  3. 第四季-专题1-课程规划与学习方法
  4. magento2 发邮件
  5. 如何在Win10上配置JDK1.8
  6. ModuleNotFoundError: No module named xxx 解决办法
  7. 《从Excel到R 数据分析进阶指南》一2.6 查看数据表数值
  8. 爬虫抓包,模拟提交、Fiddler和Postman结合Chrome的使用
  9. VMware vSphere Update Manager 5.0
  10. 接口 与 抽象类 区别