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

📄 chatframe.java

📁 这是一个用java做的网络聊天室
💻 JAVA
字号:
package com.chatroom;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.*;

import javax.swing.*;
import javax.swing.border.Border;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;

public class ChatFrame extends JFrame implements Runnable{
	JPanel contentPane;
	JMenuBar jMenuBar1 =new JMenuBar();
	JMenu jMenuFile =new JMenu();
	JMenuItem jMenuFileExit =new JMenuItem();
	JMenu jMenuHelp =new JMenu();
	JMenuItem jMenuHelpAbout =new JMenuItem();
	BorderLayout borderLayout1=new BorderLayout();
	JPanel jPanel1 =new JPanel();
	JPanel jPanel2 =new JPanel();
	JPanel jPanel3 =new JPanel();
	JLabel jLabel1 =new JLabel();
	JTextField niCheng =new JTextField();
	JButton enter =new JButton();
	JButton exit =new JButton();
	/////////////////////////////////////////
	Socket socket =null;
	DataInputStream in =null;
	DataOutputStream out=null;
	Hashtable listTable =new Hashtable();
	Thread thread =null;
	String name =null;
	JOptionPane jOptionPane1 =new JOptionPane();
	JTextField sendText =new JTextField();
	JLabel jLabel2 =new JLabel();
	JButton send =new JButton();
	BorderLayout borderLayout2 =new BorderLayout();
	JPanel jPanel4 =new JPanel();
	JPanel jPanel5 =new JPanel();
	BorderLayout borderLayout3 =new BorderLayout();
	TextArea chatArea =new TextArea();
	BorderLayout borderLayout4 =new BorderLayout();
	List chatList =new List();
	Checkbox male =new Checkbox();
	Checkbox female = new Checkbox();
	CheckboxGroup checkboxGroup1 =new CheckboxGroup();
	//////////////////////////////////////////////////
	//定义Socket、输入输出流和线程
	public ChatFrame() {
		// TODO Auto-generated constructor stub
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		try{
		  jbInit();
		  connectionNetwork();
		}
		catch(Exception e){
		  e.printStackTrace();
			}
		}
	

//组件初始化
	private void jbInit() throws Exception {
		// TODO Auto-generated method stub
		contentPane =(JPanel)this.getContentPane();
		contentPane.setLayout(borderLayout1);
		this.setSize(new Dimension(400,300));
		this.setTitle("网络聊天室");
		jMenuFile.setText("File");
		jMenuFileExit.setText("Exit");
		jMenuFileExit.addActionListener(new ChatFrame_jMenuFileExit_ActionAdapter(this));
		jMenuHelp.setText("Help");
		jMenuHelpAbout.setText("About");
		jMenuHelpAbout.addActionListener(new ChatFrame_jMenuHelpAbout_ActionAdapter(this));
		jPanel1.setBackground(Color.pink);
		jPanel2.setBackground(Color.orange);
		jPanel2.setAlignmentY((float)0.5);
		jPanel2.setDebugGraphicsOptions(0);
		jPanel2.setLayout(borderLayout2);
		jPanel3.setBackground(Color.pink);
		jLabel1.setText("昵称");
		niCheng.setPreferredSize(new Dimension(90,22));
		niCheng.setText("");
		enter.setText("进入");
		enter.addActionListener(new ChatFrame_enter_actionAdapter(this));
		exit.setText("退出");
		exit.addActionListener(new ChatFrame_exit_actionAdapter(this));
		sendText.setPreferredSize(new Dimension(200,22));
		sendText.setText("");
		sendText.setScrollOffset(0);
		jLabel2.setText("发送内容");
		send.setText("发送");
		send.addActionListener(new ChatFrame_send_actionAdapter(this));
		jPanel4.setLayout(borderLayout3);
		jPanel5.setPreferredSize(new Dimension(50,9));
		jPanel5.setLayout(borderLayout4);
		male.setCheckboxGroup(checkboxGroup1);
		male.setLabel("男");
		female.setCheckboxGroup(checkboxGroup1);
		female.setLabel("女");
		checkboxGroup1.setSelectedCheckbox(male);
		jPanel3.add(jLabel2,null);
		jMenuFile.add(jMenuFileExit);
		jMenuHelp.add(jMenuHelpAbout);
		jMenuBar1.add(jMenuFile);
		jMenuBar1.add(jMenuHelp);
		contentPane.add(jPanel1,BorderLayout.NORTH);
		jPanel1.add(jLabel1,null);
		jPanel1.add(niCheng,null);
		jPanel1.add(male,null);
		jPanel1.add(female,null);
		contentPane.add(jPanel2,BorderLayout.CENTER);
		contentPane.add(jPanel3,BorderLayout.SOUTH);
		jPanel3.add(sendText,null);
		jPanel1.add(enter,null);
		jPanel1.add(exit,null);
		jPanel3.add(send,null);
		jPanel2.add(jPanel4,BorderLayout.CENTER);
		jPanel4.add(chatArea,BorderLayout.CENTER);
		jPanel2.add(jPanel5,BorderLayout.EAST);
		jPanel5.add(chatList,BorderLayout.CENTER);
		this.setJMenuBar(jMenuBar1);
	}
	/*   class ChatFrame_AboutBox{
		   public ChatFrame_AboutBox() {
			// TODO Auto-generated constructor stub
			   
		}
	   }*/
		//退出系统采单
		public void jMenuFileExit_actionPerformed(ActionEvent e){
			
			System.exit(0);
		}
		
		//帮助菜单
	 /*  public void jMenuHelpAbout_actionPerformed(ActionEvent e){	
			
	        ChatFrame_AboutBox dlg=new ChatFrame_AboutBox(this);
			Dimension dlgSize =dlg.getPreferredSize();
			Dimension frmSize =getSize();
			Point loc =getLocation();
			dlg.setLocation((frmSize.width-dlgSize.width)/2 + loc.x,(frmSize.height-dlgSize.height)/2+loc.y);
			dlg.setModal(true);
			dlg.pacK();
			dlg.show();
			
		}*/
		
		protected void processWindowEvent(WindowEvent e){
			super.processWindowEvent(e);
			if(e.getID()==WindowEvent.WINDOW_CLOSING){
				jMenuFileExit_actionPerformed(null);
			}
		}
		//连接网络功能
		void connectionNetwork(){
			if(socket!=null&&in!=null&&out!=null){
				try{
					socket.close();
					in.close();
					out.close();
				}
				catch(Exception e){
					e.printStackTrace();
				}
			}
			//连接网络,创建输入输出流
			try{
				socket =new Socket("192.168.0.8",6000);
				in =new DataInputStream(socket.getInputStream());
				out =new DataOutputStream(socket.getOutputStream());			
			}
			catch(Exception e){
				jOptionPane1.showMessageDialog(null,"连接网络失败!请确定是否启动服务器","登录失败",jOptionPane1.ERROR_MESSAGE);
			}
			//创建线程
			if(thread==null){
				thread =new Thread(this);
				thread.start();
			}
		}
		

		
		
		
		public void run() {
			// TODO Auto-generated method stub
			String receiveMessage =null;
			while(true){
			  if(in!=null){
				try{
					receiveMessage =in.readUTF();//接受信息
					//处理聊天内容
					if(receiveMessage.startsWith("聊天内容:")){
						String chatContent =receiveMessage.substring(receiveMessage.indexOf(":")+1);
						chatArea.append("\n"+chatContent);
					}
				   //将聊天者的信息加到chatList上
					else if(receiveMessage.startsWith("聊天者:")){
						String people =receiveMessage.substring(receiveMessage.indexOf(":")+1,receiveMessage.indexOf("性别"));
						String sex = receiveMessage.substring(receiveMessage.indexOf("性别")+2);
						listTable.put(people, people+"("+sex+")");
						chatList.add((String)listTable.get(people));
						chatList.repaint();
					}
				  //将聊天者的信息从chatList和listTable上删除
					else if(receiveMessage.startsWith("用户离线:")){
						String awayPeopleName =receiveMessage.substring(receiveMessage.indexOf(":")+1);
						chatList.remove((String)listTable.get(awayPeopleName));
						chatList.repaint();
						chatArea.append("\n"+(String)listTable.get(awayPeopleName)+"离线");
						listTable.remove(awayPeopleName);
					}
					Thread.sleep(5);
				}
				catch(IOException ee){
					chatList.removeAll();
					chatList.repaint();
					listTable.clear();
					jOptionPane1.showMessageDialog(null, "和服务器断开了!","接收信息失败!",jOptionPane1.INFORMATION_MESSAGE);
					
					break;
					
				}
				catch(InterruptedException e){
					}
				}
				
			}
			
		}
		
	//进入聊天室	
	void enter_actionPerformed(ActionEvent e){
		if(socket!=null){
			name=niCheng.getText();
			String sex =checkboxGroup1.getSelectedCheckbox().getLabel();
			if(socket!=null&&name!=null){
				try{
					out.writeUTF("姓名:"+name+"性别:"+sex);
				}
				catch(IOException ee){
					jOptionPane1.showMessageDialog(null, "发送信息失败!请确定网络是否连通","发送信息错误",jOptionPane1.ERROR_MESSAGE);
							
				}
			}
			jOptionPane1.showMessageDialog(null, "连接网络成功!您可以聊天了!","登录成功",jOptionPane1.INFORMATION_MESSAGE);
				
			}
		}
	
	 //退出聊天室
		void exit_actionPerformed(ActionEvent e){
		try {
			out.writeUTF("用户离开:");
		} catch (IOException ee) {
			// TODO: handle exception
		}
		finally{
			System.exit(0);
		}
		}

		//发送聊天信息
		void send_actionPerformed(ActionEvent e){
			String sendMessage ="";
			sendMessage=sendText.getText();
			if(sendMessage.length()>0){
				try {
					out.writeUTF("聊天:"+name+"说:"+sendMessage);
					
					sendText.setText("");
					
					
				} catch (IOException event) {
					// TODO: handle exception
				}
			}
		}
		
	}
		
	//以下代码完成注册事件监听器功能,与菜单栏的功能对应
	class ChatFrame_jMenuFileExit_ActionAdapter implements ActionListener{
		ChatFrame adapter;
		ChatFrame_jMenuFileExit_ActionAdapter(ChatFrame adapter) {
			// TODO Auto-generated constructor stub
			this.adapter =adapter;
		}

		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			adapter.jMenuFileExit_actionPerformed(e);
		}
		
	}
	class ChatFrame_jMenuHelpAbout_ActionAdapter implements ActionListener{
		ChatFrame adapter;
		ChatFrame_jMenuHelpAbout_ActionAdapter(ChatFrame adapter) {
			// TODO Auto-generated constructor stub
			this.adapter =adapter;
			
		}
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
      //      adapter.jMenuHelpAbout_actionPerformed(e);			
		}
	}
	
	class ChatFrame_enter_actionAdapter implements ActionListener{
		ChatFrame adapter;
        
		ChatFrame_enter_actionAdapter(ChatFrame adapter) {
			this.adapter =adapter;
			// TODO Auto-generated constructor stub
		}
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			adapter.enter_actionPerformed(e);		
		}
		
	}
	class ChatFrame_exit_actionAdapter implements ActionListener{

		ChatFrame adapter;
		
		ChatFrame_exit_actionAdapter(ChatFrame adapter) {
			// TODO Auto-generated constructor stub
			this.adapter =adapter;
		}
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			adapter.exit_actionPerformed(e);
						
		}
	}
		
	class ChatFrame_send_actionAdapter implements ActionListener{
		ChatFrame adapter;
		ChatFrame_send_actionAdapter(ChatFrame adapter) {
			// TODO Auto-generated constructor stub
			this.adapter =adapter;
		}
		
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			adapter.send_actionPerformed(e);
			
		}
		
	}

	









⌨️ 快捷键说明

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