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

📄 chatfr.java

📁 JAVA
💻 JAVA
字号:
package chatSystem;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.Socket;
import java.util.*;
import javax.swing.*;

/**
 * 这个类用来实现用户一对一单聊的线程类
 * 当SingleServer类接收到一个请求时,就传递一个socket给此类,并实例化它
 * 这个是一个用来处理用户与一个朋友单聊的类,由一个界面类和一个线程类组成
 */
public class ChatFr extends JFrame implements ActionListener
{

	private static final long serialVersionUID = 1461600851709524462L;
	JTextArea tshow,twrite;
	JButton send,close;
	JPanel tp,bp;
	String str,received,me,m;
	Dimension dim;
	int port,clientport;
	boolean request=true,stop=false;
	ClientThread t=null;
	Date d=null;
	
	/**
	 * 构造函数,用来生成界面,并初始化一些变量
	 * @param color
	 * @param s
	 * @param me
	 */
	public ChatFr(Color color,Socket s,final String me)
	{
		this.me=me;
		setTitle("与聊天中");
	   	setSize(530,300);
	   	tshow=new JTextArea(9,45);
	   	tshow.setFont(new Font("SansSerif",Font.BOLD,12));
	   	tshow.setEditable(false);
	   	JScrollPane scrollpane=new JScrollPane(tshow);
	   	twrite=new JTextArea(3,45);
	   	twrite.setFont(new java.awt.Font("SansSerif", Font.BOLD, 12));
	   	twrite.setEnabled(true);
	   	twrite.setLineWrap(true);
	   	JScrollPane wjsp=new JScrollPane(twrite);
	   	tp=new JPanel();
	   	tp.setBackground(color);
	   	tp.add(scrollpane,BorderLayout.NORTH);
	   	tp.add(wjsp,BorderLayout.SOUTH);
	   	add(tp,BorderLayout.CENTER);
	   	send=new JButton("发送");
	   	send.addActionListener(this);
	   	close=new JButton("关闭");
	   	close.addActionListener(this);
	   	bp=new JPanel();
	   	bp.setBackground(color);
	   	bp.add(send);
	   	bp.add(close);
	   	add(bp,BorderLayout.SOUTH);
	   	Toolkit kit=Toolkit.getDefaultToolkit();
	   	dim=kit.getScreenSize();
	   	setLocation((dim.width-500)/2,(dim.height-300)/2 );
	   	t=new ClientThread(s);
	   	t.start();
	   	setVisible(true);
	   	d=new Date();
	   	
	   	twrite.addKeyListener(new KeyAdapter()
		   {
			   public void keyPressed(KeyEvent ke)
			   {
				   if(ke.getKeyCode()==KeyEvent.VK_ENTER&&ke.isControlDown())//当用户按Ctrl+Enter时发送消息
				   {
					   str=(d.getYear()+1900)+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+(d.getMinutes()+1)
					   +":"+(d.getSeconds()+1)+"\n"+me+"说: "+twrite.getText();
					    try 
					    {
					    	t.sendMessage(str);
							tshow.append(str+"\n");
							twrite.setText("");
						}
					    catch (Exception e)
					    {
							e.printStackTrace();
						} 
				   }
			   } 
		   });
		   addWindowListener(new WindowAdapter()
		   {
			   public void windowClosing(WindowEvent we)
			   {
				   t.quiet();
				   new WarmDialog("你中毒了","哈哈..").setVisible(true);
			   }
		   });
	   }
	
	
	   /**
	    * 处理按钮事件,发送消息,关闭对话框
	    */	   
      public void actionPerformed(ActionEvent ae)
      {
	   if(ae.getSource()==send)
	   {
		   str=(d.getYear()+1900)+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+(d.getMinutes()+1)
		   +":"+(d.getSeconds()+1)+"\n"+me+"说: "+twrite.getText();
		    try 
		    {
		        t.sendMessage(str);	
				tshow.append(str+"\n");
				twrite.setText("");
			}
		    catch (Exception e)
		    {
				e.printStackTrace();
			} 
	   }
	   else if(ae.getSource()==close)
	   {
		   t.quiet();
		   setVisible(false);
	   }
     }
      
    /**
     *  这个类是用来接收对方发来的消息的
     * @author 黄祖光
     *
     */  
    public  class ClientThread extends Thread
  	{
  		Socket socket=null;
  		BufferedReader br=null;
  		PrintWriter pw=null;
  		String str="";
  		boolean quit=false;
  		ChatFr cf=null;
  		
  		ClientThread(Socket s)
  		{
  		     socket=s;
  		     try
  		     {
  				br=new BufferedReader(new InputStreamReader(s.getInputStream()));//实例化输入流
  				pw=new PrintWriter(new OutputStreamWriter(s.getOutputStream()));//实像化输出流
  			 } 
  		     catch (IOException e) 
  		     {
  				e.printStackTrace();
  			 }
  		     
  		}
  		/**
  		 * 监听对方发来的消息,收到就显示在对话框上
  		 */
  		public void run()
  		{
  			while(!quit)
  			{
  				try
  				{
  					System.out.println("收消息前.....");
  					str=br.readLine();
  					System.out.println("收到信息了...."+str);
  					while(!"".equals(str))
  					{
  						tshow.append(str);
  						tshow.append("\n");
  						str="";
  					}
  				}
  				catch (IOException e) 
  				{
  					//e.printStackTrace();
  				}
  			}
  			try
  			{
  			  br.close();
  			  pw.close();
  			  socket.close();
  			}
  			catch(IOException e)
  			{
  				e.printStackTrace();
  			}
  		}
  		/**
  		 * 用来发送用户的消息
  		 * @param s
  		 */
  		public void sendMessage(String s)
  		{
             pw.println(s);
             pw.flush();
             System.out.println("发送信息了....");
  		}
  		/**
  		 * 通过赋值给变量来控制线程的运行
  		 *
  		 */
  		public void quiet()
  		{
  			quit=true;
  			
  		}
  	}
}

⌨️ 快捷键说明

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