⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatclient.java

📁 Java scoket 网络聊天室(加入QQ表情)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 *    Socket 网络聊天室
 *     客户端聊天界面
 *
 *@author 董利伟
 *@version 1.0 2006/07/26
 */

package dongliwei.chat.client;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.net.*;
import java.util.*;


/**
 *聊天室的主窗体实现了Runnable接口,该线程的Run方法用于
 *不断的接受服务器所发送的信息
 */
public class ChatClient extends JFrame implements Runnable
{
	JPanel jp1;//窗体上默认的容器
	JFrame jf;//窗体的引用 
	
	int frame_W;//窗体的宽度
	int frame_H;//窗体的高度
	
	/**
	 *聊天室的菜单项目 
	 */
	JMenuBar jmb;
	JMenu menuFile;
	JMenu menuEdit;
	JMenu menuPastime;
	JMenu menuRule;
	JMenu menuHelp;
	
	JMenuItem menuGame1;
	JMenuItem menuGame2;
	JMenuItem menuGame3;
	JMenuItem menuGame4;
	JMenuItem menuGame5;
	JMenuItem menuGame6;
	JMenuItem menuGame7;
	
	JPanel userListContainer;//记录在线用户的昵称等相关内容的容器
	JEditorPane userList;//用户列表
	JScrollPane sp;
	
	
	JPanel userOperateContainer;//容纳用户进行聊天工具的按钮
	JComboBox expression;//存放用户表情的下拉列表
	JLabel txt1 = new JLabel("   对   ");
	JComboBox users;//存放用户的下拉列表
	JLabel txt2 = new JLabel("  说  ");
	JEditorPane speak;//用户进行对话的面板
	String speaks = "";
	JScrollPane sp1;
	JButton btOk = new JButton("发送");//发送用户的聊天内容
	
	JEditorPane chatAnnal;//用户之间的聊天信息
	JScrollPane sp2;
	
	ClientOperationDispose cod;//业务逻辑处理类
	
	Thread thread ;
	
	Font f = new Font("宋体",0,15);//为了同一的初始化窗体的字体
	
	String str_user_name;//用于存储当前登录的用户昵称
	
	String str_user_fullname;//用于存储用户的全部信息 
	
	boolean closeframe = false;
	
	String talks = "";
	
	String osfont = " face = '宋体' ";
	String ossize = " size = 4 ";
	String oscolor = " color = red ";
	String brr = "<br>";
	String clientfont = " face = '宋体' ";
	String clientsize = " size = 4 ";
	String clientcolor = " color = blue ";
	
	String list = "";
	
	FaceDialog fd;//表情对话框
	RuleDialog rd;//声明对话框
	AttributeBar ab;//设置字体对话框
	
	Color frameColor;
	
	public ChatClient()
	{
		jf = this;
		jp1 = (JPanel)this.getContentPane();
		jp1.setLayout(null);
		
		frameColor = this.getBackground();
		
		Toolkit tk = this.getToolkit();
		Dimension dms = tk.getScreenSize();
		this.frame_W = (int)(dms.getWidth());
		this.frame_H = (int)(dms.getHeight());
		this.setBounds(0,0,frame_W,frame_H);		
		
		jmb = new JMenuBar();
		menuFile = new JMenu("文件");
		menuEdit = new JMenu("字体");
		menuPastime = new JMenu("娱乐");
		menuRule = new JMenu("关于");
		menuHelp = new JMenu("帮助");
		

		
		menuGame1 = new JMenuItem("当空接龙");
		menuGame2 = new JMenuItem("扫雷游戏");
		menuGame3 = new JMenuItem("纸牌游戏");
		//menuGame4 = new JMenuItem("桌上弹球");
		menuGame5 = new JMenuItem("播放器");
		menuGame6 = new JMenuItem("音量控制");
		menuGame7 = new JMenuItem("屏幕键盘");
		
		menuPastime.add(menuGame1);
		menuPastime.add(menuGame2);
		menuPastime.add(menuGame3);
	//	menuPastime.add(menuGame4);
		menuPastime.addSeparator();
		menuPastime.add(menuGame5);
		menuPastime.add(menuGame6);
		menuPastime.add(menuGame7);
		
		menuGame1.addMouseListener(new MenuEventBar());
		menuGame2.addMouseListener(new MenuEventBar());
		menuGame3.addMouseListener(new MenuEventBar());
	//	menuGame4.addMouseListener(new MenuEventBar());
		menuGame5.addMouseListener(new MenuEventBar());
		menuGame6.addMouseListener(new MenuEventBar());
		menuGame7.addMouseListener(new MenuEventBar());
		
		jmb.add(menuFile);
		jmb.add(menuEdit);
		jmb.add(menuPastime);
		jmb.add(menuRule);
		jmb.add(menuHelp);
		this.setJMenuBar(jmb);
		menuRule.addMouseListener(new MenuEventBar());
		menuEdit.addMouseListener(new MenuEventBar());
		menuHelp.addMouseListener(new MenuEventBar());
		/**
		 *显示当前用户的标签
		 */
		JLabel infouser = new JLabel("    当前在线用户");
		infouser.setFont(new Font("宋体",Font.BOLD,17));
		infouser.setBounds(frame_W-210,0,200,25);
		jp1.add(infouser);
		
		str_user_name = ClientInfo.userName;//保存用户的昵称
		str_user_fullname = ClientInfo.imageURL + ClientInfo.userName;
		
		userList = new JEditorPane("text/html",list);
		sp = new JScrollPane(userList);
		sp.setSize(200,530);
		userList.setEditable(false);
		sp.setLocation(frame_W-210,30);
		jp1.add(sp);	
		
		userOperateContainer = new JPanel();//容纳用户进行聊天工具的按钮		
		userOperateContainer.setLayout(null);
		
		expression = new JComboBox();
		expression.setBounds(80,10,100,25);
		userOperateContainer.add(expression);
		expression.addItem("微笑着");
		expression.addItem("高兴的");
		expression.addItem("哭着");
		expression.addItem("害羞的");
		expression.addItem("生气的");
		expression.addItem("伤心的");
		expression.addItem("无奈的");
		expression.addItem("大笑着");
				
		txt1.setBounds(190,10,50,25);
		userOperateContainer.add(txt1);
		
		/**
		 *用户姓名的下拉列表
		 */
		users = new JComboBox();
		users.setBounds(245,10,100,25);
		userOperateContainer.add(users);
		
		/**
		 *用户进行对话的对话框
		 */
		speak = new JEditorPane("text/html",speaks);
		speak.addKeyListener(new BtEnter());
		speak.setFont(f);
		sp1 = new JScrollPane(speak);
		sp1.setBounds(80,40,430,90);
		userOperateContainer.add(sp1);
		
		JButton btface  = new JButton("特殊表情");
		btface.setBounds(410,10,100,25);
		btface.addActionListener(
			new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					if(fd == null)
					{
						fd = new FaceDialog();
					}
				}
			});
		userOperateContainer.add(btface);
		
		btOk = new JButton("  发送  ");
		btOk.addActionListener(new BtActionEvent());
		btOk.setBounds(550,100,100,25);
		userOperateContainer.add(btOk);	
			
		txt2.setBounds(350,10,100,25);
		userOperateContainer.add(txt2);

		userOperateContainer.setSize(frame_W-210,200);
		userOperateContainer.setLocation(0,frame_H-210);
		jp1.add(userOperateContainer);
		
		/**
		 *显示用户之间的对话信息
		 */
		chatAnnal = new JEditorPane("text/html",talks);
		chatAnnal.setEditable(false);
		sp2 = new JScrollPane(chatAnnal);
		sp2.setBounds(0,0,frame_W-210,frame_H-210);
		jp1.add(sp2);
		
		Calendar cdt = Calendar.getInstance();
    	int yy = cdt.get(Calendar.YEAR);
    	int mm = cdt.get(Calendar.MONTH) + 1;
    	int dd = cdt.get(Calendar.DATE);
		String s = " ★★★★★★【今天是 " + yy + " 年 " + mm + " 月 " + dd + " 日】★★★★★★";
		talks = talks + brr + "<font " + oscolor + ossize +  osfont + ">" + s + "</font>" + brr;
		chatAnnal.setText(talks);
		
		try 
	    {
	        cod = new ClientOperationDispose();
	    }
	    catch (Exception ex) 
	    {
	    	System.out.println("连接失败");
	    	ex.printStackTrace();
	    }
		cod.loginClient();		
		thread = new Thread(this);
		thread.start();
		
		String todays = "";
		
		JEditorPane today = new JEditorPane("text/html",todays);	

		today.setText("<br><br>&nbsp&nbsp&nbsp 当前用户:" + ClientInfo.imageURL + ClientInfo.userName + "<br>"
						+"<font color = red >"+"&nbsp&nbsp&nbsp今天是" + yy + "年" + mm + "月" + dd + "日 </font>" );
		today.setBackground(frameColor);
		today.setEditable(false);
		today.setSize(200,200);
		today.setLocation(frame_W-210,frame_H-210);
		jp1.add(today);
		
		
		this.setTitle("欢迎进入聊天室");
		this.setResizable(false);
		this.addWindowListener(new CloseFrame());
		
		this.setVisible(true);
	}
	
    /**
     *
     *聊天室客户端业务处理模块
     *       (内部类)
     *
     */
    class ClientOperationDispose 
    {
    	Socket client;
		InputStream inputstream;
		BufferedReader br;
		OutputStream outputstream;
		PrintWriter pw;
		
		String str = "";
		
		
		
		public ClientOperationDispose()throws Exception
		{
			String ip = ClientInfo.serverIP;
			int part = ClientInfo.serverPart;
			client = new Socket(ip,part);
			
			inputstream = client.getInputStream();
			br = new  BufferedReader(new InputStreamReader(inputstream));
			
			outputstream = client.getOutputStream();
			pw = new PrintWriter(new OutputStreamWriter(outputstream));
			
		}
		
		
		/**
		 *刚登上服务器时向服务器发送 "$newuser昵称";
		 */
		public void loginClient()
		{
			try 
		    {
				String name = ClientInfo.userName;
				String photourl = ClientInfo.imageURL;
				pw.println("$newuser" + photourl + name );
				pw.flush();	        
		    }
		    catch(Exception ex)
		    {
		    	System.out.println(ex);
		    	ex.printStackTrace();
		    }
		}
		
		/**
		 *用于客户端用户向其他用户发送信息
		 */
		public void speak(String str)
		{
			try 
		    {
				pw.print(str);
				System.out.println("完成发送");
				pw.flush();	        
		    }
		    catch(Exception ex)
		    {
		    	System.out.println(ex);
		    	ex.printStackTrace();
		    }		
		}
		
		/**
		 *客户端接受服务器的信息
		 */
		public void readInfo()throws Exception
		{  
			System.out.println("*********");
			String strsay = "";
			str = br.readLine();
			System.out.println(str + "00000000000");
			
			if(str.length() > 1 && str.startsWith("$userjion"))
			{
				System.out.println(str + "11111111");
				strsay = str.substring(9);
			
				String dlw1 = " ★★★★★【系统公告:  欢迎 『" + strsay + "』 上线. 】★★★★★" + "\n";
				System.out.println(dlw1);
				String dlw2 = "<font" + oscolor + ossize + osfont + ">" + dlw1 + "</font>" + brr;
				System.out.println(dlw2);
				talks = talks + dlw2;
				chatAnnal.setText(talks);
				
				chatAnnal.selectAll();
				users.removeAllItems();
				users.addItem(" 大家 ");
				userList.setText("");
				list = "";				
			}
			else if(str.length() > 1 && str.startsWith("$newuser"))
			{
				System.out.println(str + "222222222");
				String str_name = str.substring(8);

				list = list + str_name+ "<br>" ;
				
				userList.setText(list);
				
				int aa1 = str.lastIndexOf("height=20>");
				String sa1 = str.substring(aa1 + 10);
				System.out.println ("+++++++++++++++++++++++++++++++++++++" + sa1);
				
				if(!(str_user_name.equals(sa1)))
				{				
					users.addItem(sa1);
				}				
			}
			else if(str.length() > 1 && str.startsWith("$quituser"))
			{
				strsay = str.substring(9);

				String dlw1 = " ★★★★★【系统公告:  大家的好朋友 『" + strsay + "』 下线了. 】★★★★★" + "\n";
				String dlw2 = "<font " + oscolor + ossize +  osfont + ">" + dlw1 + "</font>" + brr;				
				talks += dlw2;
				chatAnnal.setText(talks);
				users.removeAllItems();
				users.addItem(" 大家 ");
				userList.setText("");
				list = "";
			}
			else if(str != "")
			{
				System.out.println(str + "33333333");
				
				String dlw = "<font " + clientcolor + clientsize +  clientfont + ">" + " " + str + "\n" + "</font>" + brr;				
				talks += dlw;
				chatAnnal.setText(talks);
				chatAnnal.selectAll();
			}
		}
		
		
		/**
		 *用于断开客户端的连接
		 */
		public void diosConn()
		{
			pw.println("$quituser" + str_user_fullname);
			pw.flush();
			System.out.println("已经发送" + "$quituser" + str_user_fullname);
			System.exit(0);
		}	
    }
    
    /**
     *窗体的 Run 方法
     */
    public void run()
    {
    	try 
	    {
	    	while(true)
	    	{
	    		cod.readInfo();
	    	}
	        
	    }
	    catch (Exception ex) 
	    {
	    	ex.printStackTrace();
	    }
    }
    
    /**
     *选择表情的对话框
     */
    class FaceDialog
	{
		JDialog jdg;
		JPanel fp;
		JButton[] bt;
		JScrollPane sp;
		
		public FaceDialog()
		{
			jdg = new JDialog(jf);
			fp = new JPanel();
			fp.setLayout(new GridLayout(10,10,2,2));
			sp = new JScrollPane(fp);
			jdg.add(sp);
			
			bt = new JButton[96];
			for (int i = 0; i < 96; i++)
			{
				bt[i] = new JButton(new ImageIcon("image/" + i + ".gif"));
				fp.add(bt[i]);
				bt[i].addActionListener(new BtFaceEvent());
			}
			jdg.setSize(600,250);
			jdg.setTitle("请选择表情");
			jdg.setLocation(0,350);
			jdg.setAlwaysOnTop(true);
			jdg.setFocusCycleRoot(true);
			jdg.setResizable(false);
			jdg.addWindowListener(
				new WindowAdapter()
				{
					public void windowClosing(WindowEvent e)
					{
						fd = null;
						jdg.dispose();
					}					
				});
			jdg.setVisible(true);
		}
		
		class BtFaceEvent implements ActionListener
		{
			public void actionPerformed(ActionEvent e)
			{
				for (int i = 0; i < 96; i++)
				{
					if(e.getSource() == bt[i])
					{
						String s1 = speak.getText();
						System.out.println (s1);
						int a = s1.indexOf("<body>");
						int b = s1.lastIndexOf("</body>");
						String s2 = s1.substring(a+11,b);
						
						String ss = s2 + "<img src= file:./image/" + i + ".gif width=20 height=20>";
						System.out.println("dongliwei   1 2 3 4 5 6 7 8 9 0 " + ss);
						speak.setText(ss);	
						fd = null;					
						jdg.dispose();
						
					}
				}
			}
		}
		
	}
    
    class CloseFrame extends WindowAdapter
    {
    	public void windowClosing(WindowEvent e)
    	{
    		cod.diosConn();
    	}
    }
    
    class BtActionEvent implements ActionListener
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		if(e.getSource() == btOk)
    		{
    			if(speak.getText().trim().equals(""))
    			{
    				JOptionPane.showMessageDialog(null, "不能发送空信息", "信息提示", JOptionPane.ERROR_MESSAGE);
    			}
    			else
    			{
    				Calendar cdt = Calendar.getInstance();
    				String s1 = ClientInfo.userName;
    				String s2 = (String)expression.getSelectedItem();
    				String s3 = (String)users.getSelectedItem();
    				int hh = cdt.get(Calendar.HOUR);
    				int mm = cdt.get(Calendar.MINUTE);
    				int ss = cdt.get(Calendar.SECOND);
    				System.out.println("所说时间");
    				
    			    String str4 = "〖" + s1 + "〗 于 " + hh + ":" + mm + ":" + ss + "  " + s2 + "对 〖" + s3 + "〗 说:  \n";
    				cod.speak(str4);

    				String sa1 = speak.getText();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -