山寨版QQ

登录界面:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CopyQQ extends JFrame{
	Container c;
	JPanel p;
	JLabel lab=new JLabel("欢迎使用javaQQ");
	JLabel labserver=new JLabel("服务器:");
	JLabel labuser=new JLabel("用户名:");
	JLabel labpassword=new JLabel("密码:");
	JTextField tetserver=new JTextField(20);
	JTextField tetuser=new JTextField(10);
	JTextField tetpassword=new JTextField(15);
	JButton btnlog=new JButton("登录");
	JButton btncancel=new JButton("取消");
	JButton btnreg=new JButton("注册");
	
	void init(){
		c=this.getContentPane();
		c.setLayout(new BorderLayout());
		p=new JPanel();p.setLayout(null);
		p.add(lab);
		p.add(labserver);
		p.add(labuser);
		p.add(labpassword);
		p.add(tetserver);
		p.add(tetuser);
		p.add(tetpassword);
		p.add(btnlog);
		p.add(btncancel);
		p.add(btnreg);
		btnreg.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				Register reg=new Register();
				reg.setVisible(true);
			}
		});
		btnlog.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String tmpserver=tetserver.getText();
				String tmpuser=tetuser.getText();
				String tmppassword=tetpassword.getText();
				ResultSet rs;
				JDBC jd=new JDBC();
				Connection cn=null;
				PreparedStatement ps=null;
				try {
					cn=jd.getConnection();
					String sqlselect="select * from information where LogName=? and Password=?";
					ps=cn.prepareStatement(sqlselect);
					ps.setString(1,tmpuser);
					ps.setString(2,tmppassword);
					rs=ps.executeQuery();
					String qq="";
					while(rs.next()){
						qq=rs.getString("LogName");
					}
                     if(qq.equals("")){
                    	 JOptionPane.showMessageDialog(null, "用户名或密码错误");
                     }else{
                    	 JOptionPane.showMessageDialog(null, "登录成功");
                    	 Main ma=new Main(qq);
                    	 ma.setVisible(true);
                    	 CopyQQ.this.dispose();
                    	// System.exit(0);
                     }
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		});
		btncancel.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
			}
		});
		lab.setBounds(80,0,200,30);
		labserver.setBounds(60,30,50,20);
		tetserver.setBounds(110,30,100,20);
		labuser.setBounds(60,60,50,20);
		tetuser.setBounds(110,60,100,20);
		labpassword.setBounds(60,90,50,20);
		tetpassword.setBounds(110,90,100,20);
		btnlog.setBounds(30,120,70,30);
		btncancel.setBounds(110,120,70,30);
		btnreg.setBounds(190,120,70,30);
		c.add(p,BorderLayout.CENTER);
		this.setSize(300,200);
		this.setVisible(true);
	}
	public CopyQQ(String s){
		super(s);
		init();
	}
	public static void main(String[] args) {
		CopyQQ qq=new CopyQQ("用户登录");
	}

}


注册界面:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Register extends JFrame{
	JLabel jllog;
	JLabel jlname;
	JLabel jlpassword;
	JLabel jlsurepassword;
	JLabel jlip;
	JLabel jlport;
	JTextField tetlog;
	JTextField tetname;
	JTextField tetpassword;
	JTextField tetsurepassword;
	JTextField tetip;
	JTextField tetport;
	JButton btnreg;
	JPanel p;
	Container c;
	public void init(){
		c=this.getContentPane();c.setLayout(new BorderLayout());
		p=new JPanel();p.setLayout(null);
		btnreg=new JButton("注册");
		jllog=new JLabel("登录名:");jlname=new JLabel("姓名:");jlpassword=new JLabel("密码:");
		jlsurepassword=new JLabel("确认密码:");jlip=new JLabel("IP:");jlport=new JLabel("端口号:");
		tetlog=new JTextField(20);tetname=new JTextField(20);tetip=new JTextField(20);
		tetpassword=new JTextField(20);tetsurepassword=new JTextField(20);tetport=new JTextField(20);
		p.add(jllog);p.add(jlname);p.add(jlpassword);p.add(jlsurepassword);p.add(jlip);p.add(jlport);
		p.add(tetlog);p.add(tetname);p.add(tetpassword);p.add(tetsurepassword);p.add(tetip);p.add(tetport);
		p.add(btnreg);
		jllog.setBounds(0,0,130,20);tetlog.setBounds(150,0,120,20);
		jlname.setBounds(0,30,130,20);tetname.setBounds(150,30,120,20);
		jlpassword.setBounds(0,60,130,20);tetpassword.setBounds(150,60,120,20);
		jlsurepassword.setBounds(0,90,130,20);tetsurepassword.setBounds(150,90,120,20);
		jlip.setBounds(0,120,130,20);tetip.setBounds(150,120,120,20);
		jlport.setBounds(0,150,130,20);tetport.setBounds(150,150,120,20);
		btnreg.setBounds(0,180,150,20);
		btnreg.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String strlog=tetlog.getText();
				String strname=tetname.getText();
				String strpassword=tetpassword.getText();
				String strsurepassword=tetsurepassword.getText();
				String strip=tetip.getText();
				String strport=tetport.getText();
				if(strpassword.equals(strsurepassword)&&!strpassword.equals(null)){
					JDBC jd=new JDBC();
					Connection conn = null;
					PreparedStatement ps = null;
					try {
						conn=jd.getConnection();
						String sqlinsert="insert into information(LogName,Name,Password,Ip,Port) values(?,?,?,?,?)";
						ps = conn.prepareStatement(sqlinsert);
						ps.setString(1,strlog);
						ps.setString(2,strname);
						ps.setString(3,strpassword);
						ps.setString(4,strip);
						ps.setString(5,strport);
						ps.executeUpdate();
						System.exit(0);
					} catch (SQLException e2) {
						e2.printStackTrace();
					}
					JOptionPane.showMessageDialog(null, "注册成功");
					System.exit(0);
				}
				else{
					JOptionPane.showMessageDialog(null, "两次密码不一致");
				}
			}
		});
		c.add(p,BorderLayout.CENTER);
		this.setSize(300,250);
		this.setVisible(true);
	}
	public Register(){
		super("新用户注册");
		init();
	}
	public static void main(String[] args) {
		Register reg=new Register();
	}

}


主界面:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame{
	Container c;
	JLabel jltop;
	JLabel jlbelow;
	JLabel user1;
	JLabel user2;
	ImageIcon image1;
	ImageIcon image2;
	JPanel p=new JPanel();
	String myQQ="";
	void init(){
		c=this.getContentPane();
		c.setLayout(new BorderLayout());
		p.setLayout(null);
		jltop=new JLabel("                             好友列表");
		jlbelow=new JLabel("                          欢迎您,李四");
		image1=new ImageIcon("F:/程序/java程序/高级案例与分析/image/qq1.png");
		image2=new ImageIcon("F:/程序/java程序/高级案例与分析/image/qq2.png");
		user1=new JLabel("张三",image1,JLabel.LEFT);
		user2=new JLabel("王五",image2,JLabel.LEFT);
		user1.setBounds(0,20,70,20);
		user2.setBounds(0,50,70,20);
		c.add(jltop,BorderLayout.NORTH);
		p.add(user1);
		p.add(user2);
		c.add(p);
		c.add(jlbelow,BorderLayout.SOUTH);
		JDBC jd=new JDBC();
		Connection cn=null;
		PreparedStatement ps=null;
		ResultSet rs;
		try {
			cn=jd.getConnection();
			String sqlSelect="select * from information where LogName=?";
			ps=cn.prepareStatement(sqlSelect);
			ps.setString(1,myQQ);
			rs=ps.executeQuery();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		user1.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e){
				Talk t1=new Talk(myQQ,3000,5000);
				Talk t2=new Talk("user1",5000,3000);
			}
		});
		user2.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent e){
				Talk t1=new Talk(myQQ,3000,5000);
				Talk t2=new Talk("user2",5000,3000);
			}
		});
		this.setSize(250,600);
		this.setVisible(true);
	}
	public Main(String qq){
		super(qq);
		myQQ=qq;
		init();
	}
	public static void main(String[] args) {
		Main ma=new Main("欢迎使用QQ聊天");
	}

}


聊天界面:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Talk extends JFrame{
	JLabel la=new JLabel("请输入");
	JTextField tfd=new JTextField(20);
	JButton but=new JButton("发送");
	JPanel p=new JPanel();
	JTextArea jta=new JTextArea(10,20);
	Container c;
	DatagramSocket ds;
	DatagramReceive dc;
	int localPost=3000;
	int remotePost=5000;
	boolean flag=true;
	public void init(){
		c=this.getContentPane();
		c.setLayout(new BorderLayout());
		p.setLayout(new FlowLayout());
		p.add(la);p.add(tfd);p.add(but);
		c.add(p,BorderLayout.NORTH);
		c.add(jta,BorderLayout.CENTER);
		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				String temp=tfd.getText();
				jta.append("\n我说:"+temp);
				byte[] buf=temp.getBytes();
				try {
					DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localhost"),remotePost);
					try {
						ds.send(dp);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					if(temp.trim().equals("bye")){
						flag=false;
						//dc.close();
					}
				} catch (UnknownHostException e1) {
					e1.printStackTrace();
				}
			}
		});
	this.setSize(500,500);
	this.setVisible(true);
	}
	public Talk(String name,int localPost,int remotePost){
		super(name);
		this.localPost=localPost;
		this.remotePost=remotePost;
		init();
		try {
			ds=new DatagramSocket(localPost);
			dc=new DatagramReceive(name,ds,jta);
			dc.start();
		} catch (SocketException e) {
			System.out.println("DatagramSocket创建失败");
		}
		
	}
	public static void main(String[] args) {
	}

}

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

import javax.swing.JTextArea;

public class DatagramReceive extends Thread{
	String name;
	DatagramSocket ds;
	JTextArea jta;
	boolean flag=true;
	public DatagramReceive(String name,DatagramSocket ds,JTextArea jta){
		this.name=name;
		this.ds=ds;
		this.jta=jta;
	}
		public void run(){
			while(flag){
				byte[] buf=new byte[1024];
				DatagramPacket dp=new DatagramPacket(buf,buf.length);
				try {
					ds.receive(dp);
					String temp=new String(buf,0,dp.getLength());
					jta.append("\n对方说:"+temp);
					if(temp.trim().equals("bye")){
						flag=false;
						ds.close();
					}
				} catch (IOException e) {
					System.out.println(name+"接受失败");
				}
				
			}
		}

}

连接数据库部分:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC {
	Statement st;
	String url="jdbc:sqlserver://localhost:1433;DatabaseName=QQ";
	String user="sa";
	String password="a123456";
	static String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
	Connection conn;
	static {
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}  
	}
	public  Connection getConnection() throws SQLException{
		conn=DriverManager.getConnection(url,user,password);
		return conn;
	}
	public static void main(String[] args) throws ClassNotFoundException,SQLException{
		JDBC jd=new JDBC();
	}

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
资源分设为1,因为我自己只有3分资源分了,所以就不设为0了 这个山寨QQ代码2000行,基于现在可以使用IP6,给出它的设计原理 功能:山寨QQ 主要行为: ①用户注册 ②添加好友 ③好友上线头像变为彩色 ④在线上的好友头像是彩色,不在线上的好友头像是灰色,动态变化 ⑤独立窗口聊天 ⑥服务器端有两个表,全部用户表和在线用户表,都是动态改变的 代码在下面,有2000多行,总共17个文件,干脆就看看这些思路得了。 山寨QQ分为用户端和服务器端,主要用到的Java知识点有:多线程、网络编程、IO流,如果能够加入数据库当然更好,可是我在家一直没网,没有数据库,所以就把用户信息全部储存在文件中了。 服务器端3000号端口作为一个特殊的端口,放在一个单独的线程中时刻监听着。服务器的交互信息通讯端口从3001号一直向后监听,最大可以到65535号端口。 用户每次来连接服务器时,首先连接3000号端口,获取服务器正在监听的端口号,然后再去连接这个端口。 用户和服务器之间的交互信息使用对象流来传递,信息类型分为 注册消息=0、 修改密码=1、 登录验证=2、 请求聊天=3、 获取在线好友=4、 添加好友=5、 某人上线了=6 如果是登录消息,则把这个新建的套接字(套接字即Socket,网络通讯全靠他来实现)储存在一个单独的线程中,使用这个线程的类储存用户的用户名、昵称、密码、IP。然后将这个县城储存在一组向量中,即C语言中的链表。IP地址可以通过套接字得到。当用户再次和服务器发生交互信息时,直接利用这个已存在的套接字即可。 如果用户双击某个用户希望聊天时,首先从服务器端获取该用户的IP,然后再单独去连接这个用户。 用户连接用户时,和连接服务器的原理大同小异。2000号端口作为一个特殊的端口被监听着。如果一台机器上同时登陆有多个用户,则监听的端口一直往下走,最小可以到1025,总共有975个端口可以利用,用户总该用不了这么多吧。然后接下来,该不用我说了吧,连接好友正在监听的端口就是了。 建立完成连接,就可以弹出聊天窗口开始聊天了。 好了,大体思路就是这样。当然还有一些其他的功能,比如注册用户、添加好友等,和上面思路也差不多。 对了,忘了说说如何获取在线好友了 用户登录成功后,将自己所有的好友列表从文件中读取,放在一个向量中发送给服务器,服务器查看哪些人在在线用户列表中,然后返回用户的在线好友,同时通知这些在线好友某人人上线了,还是利用已建立的套接字。 用户下线后,和服务器已建立的套接字发生IOException异常,程序代码块跳转,服务器就通知用户的在线好友有人下线了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值