【无标题】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

效果如下
![在这里插入图片描在这里插入图片描述
qq登录界面
在这里插入图片描述
好友列表界面
在这里插入图片描述
聊天界面


提示:以下是本篇文章正文内容,下面案例可供参考

二、使用步骤

1.

登录界面代码如下(示例):
package frame;

public class LoginFrame extends JFrame{

int width=Toolkit.getDefaultToolkit().getScreenSize().width;
int height=Toolkit.getDefaultToolkit().getScreenSize().height;
JPanel jpanel;
JButton jbutton;
JLabel jlabel,jlabel1;
JTextField jtextfield;
JPasswordField jpasswordfield;
JCheckBox jcheckbox1,jcheckbox2;
Socket s;
public static FriendListFrame friendlistframe;
public static HashMap<String,UserThread> threadmap=new HashMap<String,UserThread>();

public LoginFrame() {
	
	this.setTitle("QQ");
	this.setBounds((width-450)/2, (height-400)/2, 450, 400);		
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			
	jlabel=new JLabel(new ImageIcon(LoginFrame.class.getResource("/image/top.jpg")));
	this.add(jlabel,"North");
	
	jpanel=new JPanel();
	jpanel.setLayout(null);
	this.add(jpanel);
	
	jlabel1=new JLabel(new ImageIcon(LoginFrame.class.getResource("/image/qq.png")));		
	jlabel1.setBounds(40, 40, 80 ,80);
	jpanel.add(jlabel1);
	
	jtextfield=new JTextField();
	jtextfield.setBounds(150,40,200,30);
	jpanel.add(jtextfield);
	
	jpasswordfield=new JPasswordField();
	jpasswordfield.setBounds(150,90,200,30);
	jpasswordfield.setText("123456");
	jpanel.add(jpasswordfield);
	
	jcheckbox1=new JCheckBox("记住密码");
	jcheckbox1.setBounds(150,130,80,30);
	jpanel.add(jcheckbox1);
	
	jcheckbox2=new JCheckBox("自动登录");
	jcheckbox2.setBounds(250,130,80,30);
	jpanel.add(jcheckbox2);
			
	jbutton=new JButton("登陆");
	jbutton.setBounds(150,170,200,30);
	jpanel.add(jbutton);
	jbutton.addActionListener(new ActionListener() {		
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			if(e.getSource().equals(jbutton)) {
				String userid=jtextfield.getText();
				Message message=new Message(userid,jpasswordfield.getText());			
				if(userid.equals("")||jpasswordfield.getText().equals("")) {
					JOptionPane.showMessageDialog(null, "账号或密码不能为空", "【出错啦】", JOptionPane.ERROR_MESSAGE);}
				try {
					s=new Socket("127.0.0.1",3333);
					ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
					oos.writeObject(message);
					
				    ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
				    Message messageget=(Message) ois.readObject();
				    if(messageget.getType()==1) {					    	
				    	friendlistframe=new FriendListFrame(userid);
				    	LoginFrame.this.dispose();
				    	
				        UserThread userthread=new UserThread(s);
				        userthread.start();
				        threadmap.put(userid, userthread);						        
				        if(messageget.getOlfriends()!=null) {
					    	friendlistframe.updateOnline(messageget.getOlfriends());
					    }
				    }
				    
				} catch (IOException e1) {e1.printStackTrace();
				} catch (ClassNotFoundException e1) {e1.printStackTrace();}
			}
		}
	});	
	this.setVisible(true);		
}





public static void main(String[] args) {
	// TODO Auto-generated method stub
	LoginFrame loginframe=new LoginFrame();

}

}

好友列表界面代码
public class FriendListFrame extends JFrame{

int width=Toolkit.getDefaultToolkit().getScreenSize().width;
JScrollPane jscrollpane;
JPanel jpanel;
JLabel[] jlabel;

public static HashMap<String,ChatFrame> chatmap=new HashMap<String,ChatFrame>();

public FriendListFrame(String userid) {
	
	this.setTitle(userid+"好友列表");
	this.setBounds(width-400,100,300,600);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	
	jpanel=new JPanel(new GridLayout(50,1,4,4));	
	jscrollpane=new JScrollPane(jpanel);
	this.add(jscrollpane);
	
	jlabel=new JLabel[15];
	String[] name= {"lily","andy","jack","bob","tony","ben","jack1","jack2","jack3","jack4","jack5","jack6","jack7","jack8","jack9"};
	for(int i=0;i<name.length;i++) {
		jlabel[i]=new JLabel(name[i],new ImageIcon(FriendListFrame.class.getResource("/image/tx"+i+".png")),JLabel.LEFT);
		jpanel.add(jlabel[i]);
		jlabel[i].setEnabled(false);
		if(jlabel[i].getText().equals(userid)) {jlabel[i].setEnabled(true);};
		jlabel[i].addMouseListener(new MouseListener() {				
			@Override
			public void mouseReleased(MouseEvent e) {	}	
			@Override
			public void mousePressed(MouseEvent e) {	}			
			@Override
			public void mouseExited(MouseEvent e) {		}		
			@Override
			public void mouseEntered(MouseEvent e) {	}		
			@Override
			public void mouseClicked(MouseEvent e) {	
				String friend=((JLabel) e.getSource()).getText();
				ChatFrame chatframe=chatmap.get(friend);
				if(chatframe==null) {
					ChatFrame chatframe1=new ChatFrame(userid,friend);
					chatmap.put(friend, chatframe1);
					chatframe=chatframe1;						
				}	
				chatframe.setVisible(true);
				Message message=UserThread.contentmap.get(friend);
				if(message!=null) {
					chatframe.appendContent(message.getTime(), message.getUserid(), message.getContent());							
					UserThread.contentmap.remove(friend,message);							
				}							
			}
		});
										
	this.setVisible(true);
	}
	}

	

public void updateOnline(String[] friends) {
	for(int i=0;i<friends.length;i++) {
		for(int a=0;a<jlabel.length;a++) {
			if(friends[i].equals(jlabel[a].getText())) {
				jlabel[a].setEnabled(true);
			}
		}
	}
	
}





public static void main(String[] args) {
	// TODO Auto-generated method stub
    FriendListFrame f=new FriendListFrame("lily");
}

}

聊天界面代码
public class ChatFrame extends JFrame{

int width=Toolkit.getDefaultToolkit().getScreenSize().width;
int height=Toolkit.getDefaultToolkit().getScreenSize().height;
JScrollPane jscrollpane;
JTextArea jtextarea;
JPanel jpanel;
JTextField jtextfield;
JButton jbutton;


public ChatFrame(String userid,String friendid) {
	
	this.setTitle(userid+"正在和"+friendid+"聊天");
	this.setBounds((width-600)/2,(height-500)/2,600,500);
	this.setResizable(false);
//	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			
	jtextarea=new JTextArea(26,25);
	jtextarea.setEditable(false);
	jscrollpane=new JScrollPane(jtextarea);
	this.add(jscrollpane,"North");
	
	jpanel=new JPanel();
	jtextfield=new JTextField(25);
	jbutton=new JButton("发送");
	jpanel.add(jtextfield);
	jpanel.add(jbutton);
	this.add(jpanel);
			
	this.setVisible(true);
	
	jbutton.addActionListener(new ActionListener() {			
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			SimpleDateFormat simpledateformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String time=simpledateformat.format(new Date());
			Message message=new Message(userid,friendid,time,jtextfield.getText());				
			jtextarea.append("                                                                "
					+ "      "+time+"\n"+userid+":\n"+jtextfield.getText()+"\n");
			jtextfield.setText("");
			UserThread userthread=LoginFrame.threadmap.get(userid);
			try {
				ObjectOutputStream oos=new ObjectOutputStream(userthread.getS().getOutputStream());
				oos.writeObject(message);
				
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	});
};

public void appendContent(String time,String userid,String content) {
	jtextarea.append("                                                                "
			+ "      "+time+"\n"+userid+":\n"+content+"\n");;
}








public static void main(String[] args) {
	// TODO Auto-generated method stub
	ChatFrame c=new ChatFrame(" "," ");

}

}

2.服务器端

代码如下(示例):
``public class Server {

ServerSocket ss;
Socket s;
public static HashMap<String,ServerThread> threadmap=new HashMap<String,ServerThread>();

public Server() throws IOException, ClassNotFoundException {
	ss=new ServerSocket(3333);
	System.out.print("服务器正在监听..\n");
	while(true) {
		s=ss.accept();
		
		ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
		Message messageget=(Message) ois.readObject();
		if(messageget.userpsw.equals("123456")) {
			Message message=new Message();
			message.setType(1);
			Set<String> set=threadmap.keySet();
		    String[] friends=set.toArray(new String[set.size()]);
		    message.setOlfriends(friends);
		    ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
			oos.writeObject(message);	
			for(int i=0;i<friends.length;i++) {
				ServerThread serverthread01=threadmap.get(friends[i]);
				ObjectOutputStream oos01=new ObjectOutputStream(serverthread01.s.getOutputStream());
				Message message01=new Message();
				message01.setOlfriends(new String[] {messageget.userid});
				oos01.writeObject(message01);				
			}	
			
			ServerThread serverthread=new ServerThread(s);
			serverthread.start();				
			threadmap.put(messageget.userid, serverthread);
			
		}
		
		
	}

	
	
	
}




public static void main(String[] args) throws ClassNotFoundException, IOException {
	// TODO Auto-generated method stub
	Server s=new Server();      
	
}

}

总结


资源下载地址:
https://download.csdn.net/download/u012922364/88763243?spm=1001.2014.3001.5501

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值