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

📄 qq.java

📁 java的一个课程设计作业——一个小的模拟QQ聊天工具 代码非常简单
💻 JAVA
字号:
/**
 * @(#)QQ.java
 *
 *
 * @author 
 * @version 1.00 2008/5/29
 */
 
 import javax.swing.*;
 import java.net.*;
 import java.awt.*;
 import java.awt.event.*;
 //import java.lang.*;
 import java.io.*;
 import java.util.*;


public class QQ extends JFrame
{
	private JPanel panel1;
	private JPanel panel2;
	private JPanel panel3;
	private JTextArea textarea1;
	private JTextArea textarea2;
	private JTextField textfield1;
	private JTextField textfield2;
	private JTextField textfield3;
	private JButton button1;
	private JButton button2;
	private JLabel label1;
	private JLabel label2; 
	private JLabel label3;
	private JScrollPane scrollpane1;
	private JScrollPane scrollpane2;
	
	//本机端口
	public static int serverPort;
	//客户机端口
	public static String clientIP;
	public static int clientPort;
	
	//用于建立UDP Socket, 发送UDP数据包
	public static DatagramSocket datagramsocket;
	
    //构造函数
    public QQ()
    {
    	//创建框架窗口
    	JFrame frame = new JFrame("QQ");
    	//窗口初始位置
    	frame.setLocation(300, 300);
    	
    	//初始化控件
    	panel1 = new JPanel();
    	panel2 = new JPanel();
    	panel3 = new JPanel();
    	
    	textarea1 = new JTextArea(13, 36);
    	//使聊天记录文本框不可编辑
    	textarea1.setEditable(false);
    	//激活自动换行功能
    	textarea1.setLineWrap(true);
    	//激活断行不断字功能
    	textarea1.setWrapStyleWord(true);
    	textarea1.setForeground(Color.blue); 
    		
    	textarea2 = new JTextArea(3, 28);
    	textarea2.setLineWrap(true);
    	textarea2.setWrapStyleWord(true);
    	
    	textfield1 = new JTextField(9);
    	textfield2 = new JTextField(3);
    	textfield3 = new JTextField(3);
    	
    	//为按钮创建连接事件
    	button1 = new JButton("连接(C)");
    	button1.addActionListener(new ConnectClient());
    	//为连接事件设置快捷键
    	button1.setMnemonic(KeyEvent.VK_C);
    	button1.addKeyListener(new KeyboardInput());
    	
    	//为按钮创建发送事件
    	button2 = new JButton("发送(S)");
    	button2.addActionListener(new SendText());
    	//为发送事件设置快捷键
    	button2.setMnemonic(KeyEvent.VK_S);
    	button2.addKeyListener(new KeyboardInput());
    	
    	label1 = new JLabel("IP地址");
    	label2 = new JLabel("端口");
    	label3 = new JLabel("本机端口");
    	
    	scrollpane1 = new JScrollPane();
    	scrollpane1.setViewportView(textarea1); 
    	scrollpane2 = new JScrollPane();
    	scrollpane2.setViewportView(textarea2);
    	
	   	//面板界面布局
	   	panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
    	panel1.add(label1);
    	panel1.add(textfield1);
    	panel1.add(label2);
    	panel1.add(textfield2);
    	panel1.add(label3);
    	panel1.add(textfield3);
    	panel1.add(button1);
    	    
    	panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
    	panel2.add(scrollpane1);
    	    	
    	panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
    	panel3.add(scrollpane2);
    	panel3.add(button2);
    	
    	//框架界面布局
    	frame.setLayout(new BorderLayout());
    	frame.add(panel1, BorderLayout.NORTH);
    	frame.add(panel2, BorderLayout.CENTER);
    	frame.add(panel3, BorderLayout.SOUTH);
    	  	
    	frame.pack();
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setVisible(true);
    }  
    	
    //连接客户机
    class ConnectClient implements ActionListener
    {
    	public void actionPerformed(ActionEvent actionevent)
    	{
    		try
    		{
    			//得到客户机的IP地址
    			clientIP = textfield1.getText();
    			//得到客户机的端口
    			clientPort = Integer.parseInt(textfield2.getText());
    			serverPort = Integer.parseInt(textfield3.getText());
    			
    			//为接收数据创建线程
    			ReceiveText receivetext = new ReceiveText();
    			Thread thread1 = new Thread(receivetext);
    			thread1.start();
    			
    			//创建UDP Socket连接
    			datagramsocket = new DatagramSocket();
				System.out.println("连接" + clientIP + ":" + clientPort + "成功.");
    		}
    		catch(SocketException socketexception)
    		{
    			System.err.println("连接" + clientIP + ":" + clientPort + "错误");
    			System.exit(1);
    		}
    	}
    }
    
    //发送文本
    class SendText implements ActionListener
    {
    	public void actionPerformed(ActionEvent actionevent)
    	{
    		try
			{
				String sendmessage = textarea2.getText();
				
				//判断输入文本框是否为空
				if(sendmessage.equals(""))
				{
					textarea1.append("不能发送空消息!\n");
					textarea1.selectAll();
				}
				else
				{
					//创建报文数据包
					DatagramPacket datagrampacket = DataConvert.PacketConvert(sendmessage, 
					InetAddress.getByName(clientIP), clientPort);
					
					//发送报文
					datagramsocket.send(datagrampacket);
					
					//聊天记录中显示消息收发时间
					Calendar calendar = Calendar.getInstance();
					int year = calendar.get(Calendar.YEAR);
					int month = calendar.get(Calendar.MONTH);
					int date = calendar.get(Calendar.DATE);
					int hour = calendar.get(Calendar.HOUR);
					int minute = calendar.get(Calendar.MINUTE);
					int second = calendar.get(Calendar.SECOND);
				
					
					textarea1.append(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
						"to" + " " + clientIP + ":" + clientPort + "\n" + sendmessage + "\n");
					
					//使聊天记录文本区滚动条自动下拉到最后
					textarea1.selectAll();
					       
					
					System.out.println(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
						clientIP + ":" + clientPort + " " + "发出数据:" + sendmessage);
				}
			}
			catch(IOException ioexception)
			{
				System.err.println("发送数据错误");
			}
			//清空输入文本区
			textarea2.setText(null);
			//将焦点回归输入文本区
			textarea2.requestFocus();   			
    	}
    }
    
    //接收文本
	//实现Runnable接口创建线程
    class ReceiveText implements Runnable
    {
    	//局部UDP Socket对象, 用于接收文本
    	private DatagramSocket datagramsocket;
		
		//为报文创建字节缓冲的数组
		private byte[] buffer = new byte[1000];
		private DatagramPacket datagrampacket = new DatagramPacket(buffer, buffer.length);
						
    	
    	public void run()
    	{
			try
			{
				//创建数据报套接字并将其绑定到本地主机上的指定端口.
				datagramsocket = new DatagramSocket(serverPort);
	
				while(true)
				{
					//UDP Socket接收报文
					datagramsocket.receive(datagrampacket);
					
					//将接收到的报文数据包转化为字符串
					String receivemessage = DataConvert.StringConvert(datagrampacket);
					
					//聊天记录中显示消息收发的时间
					Calendar calendar = Calendar.getInstance();
					int year = calendar.get(Calendar.YEAR);
					int month = calendar.get(Calendar.MONTH);
					int date = calendar.get(Calendar.DATE);
					int hour = calendar.get(Calendar.HOUR);
					int minute = calendar.get(Calendar.MINUTE);
					int second = calendar.get(Calendar.SECOND);
					
					//textarea1.setForeground(Color.red); 
					textarea1.append(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " + 
						"from" + " " + clientIP + ":" + clientPort + "\n" + receivemessage + "\n");
					
					//使聊天记录的文本区滚动条自动下拉到最后
					textarea1.selectAll();
									
					
					System.out.println(year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second + " " +
						clientIP + ":" + clientPort + " " + "接收数据:" + receivemessage);
					
				}
			}
			catch(IOException ioexception)
			{
				System.err.println("接收数据错误.");
			}
			textarea2.requestFocus();
    	}	
    }
    
    //键盘按键响应
    class KeyboardInput implements KeyListener
    {
        public void keyReleased(KeyEvent e)
        {         

        }
        //键盘按下事件
        public void keyPressed(KeyEvent e)
        {   
        	 if(e.getKeyCode() == KeyEvent.VK_C)
        	 {
        	 	new ConnectClient();
        	 }
        	 if(e.getKeyCode() == KeyEvent.VK_S)
        	 {   
                new SendText();  
        	 }
        }
        public void keyTyped(KeyEvent e)
        {   
        	         
        }
    }
     	 
    public static void main(String[] args)
    {
    	new QQ();
    } 
}

//数据格式转换
class DataConvert 
{
	//将报文字节码转换为字符串
	public static String StringConvert(DatagramPacket datagrampacket)
 	{
 		return new String(datagrampacket.getData(), 0, datagrampacket.getLength());
 	}
 	
 	//将字符串转换为报文字节码
	public static DatagramPacket PacketConvert(String string, InetAddress clientIP, int clientPort)
	{
    	byte buffer[] = string.trim().getBytes();
  		return new DatagramPacket(buffer, buffer.length, clientIP, clientPort);
 	}
}

⌨️ 快捷键说明

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