仿qq聊天工具

package com.heima.GuiChat;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
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.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GuiChat extends Frame{
	private Button send;
	private Button log;
	private Button clear;
	private Button shake;
	private TextField text;
	private TextArea toptext;
	private TextArea downtext;
	private DatagramSocket socket;
	private BufferedWriter dw;
	public GuiChat(){
		Innit();
		SouthPanel();
		CenterPanel();
		event();
	}

	private void CenterPanel() {
		Panel center=new Panel();
		toptext = new TextArea();
		downtext = new TextArea(5,1);
		center.setLayout(new BorderLayout());
		toptext.setEditable(false);
		toptext.setBackground(Color.white);
		downtext.setFont(new Font("xx", NORMAL, 18));
		center.add(toptext, BorderLayout.CENTER);
		center.add(downtext, BorderLayout.SOUTH);
		this.add(center,BorderLayout.CENTER);
	}

	private void SouthPanel() {
		Panel south=new Panel();
		text = new TextField(20);
		text.setText("192.168.1.102");
		send = new Button("发送");
		log = new Button("记录");
		clear = new Button("清除");
		shake = new Button("震动");
		south.add(text);
		south.add(send);
		south.add(log);
		south.add(clear);
		south.add(shake);
		this.add(south,BorderLayout.SOUTH);
	}

	public void event() {
		this.addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowClosing(WindowEvent e) {
				try {
					dw.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				socket.close();
				System.exit(0);
			}
		});
		send.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					sendMessage();
				} catch (IOException e1) {
					
					e1.printStackTrace();
				}
			}
		});
		log.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				logFile();
			}
		});
		clear.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				toptext.setText("");
			}
		});
		shake.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					send(new byte[]{-1},text.getText());
					shake();
				} catch (IOException e1) {
					
					e1.printStackTrace();
				}
			}
		});
		downtext.addKeyListener(new KeyAdapter(){
			public void keyReleased(KeyEvent e) {
				if(e.getKeyCode()==KeyEvent.VK_ENTER){
				try {
					sendMessage();
				} catch (IOException e1) {
					
					e1.printStackTrace();
				}
				}
			}
		});
	}
	private void shake()  {
		int x=this.getLocation().x;
		int y=this.getLocation().y;
		for (int i = 0; i < 10; i++) {
			try{
	        this.setLocation(x+20, y-20);
	        Thread.sleep(20);
	        this.setLocation(x+20, y+20);
	        Thread.sleep(20);
	        this.setLocation(x-20, y+20);
			Thread.sleep(20);
	        this.setLocation(x-20, y+20);
	        Thread.sleep(20);
	        this.setLocation(x, y);
			}
			catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}
	protected void logFile()  {
	    try {
			dw.flush();
			FileInputStream in=new FileInputStream("config.txt");
			ByteArrayOutputStream by=new ByteArrayOutputStream();
	        int len;
	        byte[] arr=new byte[8192];
	        while((len=in.read(arr))!=-1){
	        	by.write(arr,0, len);
	        }
	        String l=by.toString();
	        toptext.setText(l);
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

	private void sendMessage() throws IOException {
		String ip=text.getText();
	    ip=ip.trim().length()==0?"255.255.255.255":ip;
		String message=downtext.getText();
		send(message.getBytes(),ip);
		String time=getTime();
		String str = time+"我对"+(ip=="255.255.255.255"?"所有人":ip)+"说:\r\n"+message+"\r\n\r\n";
		dw.write(str);
		toptext.append(str);
		downtext.setText("");

	}

	private void send(byte[] arr,String ip) throws IOException {
		DatagramPacket packet=
	    new DatagramPacket(arr,arr.length, InetAddress.getByName(ip), 8888);
		socket.send(packet);
	}

	private String getTime() {
		Date s=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("YYYY年MM月DD日HH:mm:ss");
		return sdf.format(s);
	}

	public void Innit()  {
		this.setTitle("MyQQ");
		this.setLocation(500, 50);
		this.setSize(410, 600);
		Receive s1=new Receive();
		s1.start();
		try {
			dw=new BufferedWriter(new FileWriter("config.txt",true)) ;
			socket = new DatagramSocket();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		this.setVisible(true);
	}
   private class Receive extends Thread{
	   @Override
	public void run() {
		try {
			DatagramSocket ReceiveSocket=new DatagramSocket(8888);
			DatagramPacket ReceivePacket=new DatagramPacket(new byte[8192], 8192);
			while(true){
			ReceiveSocket.receive(ReceivePacket);
			byte[] arr=ReceivePacket.getData();
			int len=ReceivePacket.getLength();
			if(arr[0]==-1&&len==1){
			  shake();
			  continue;
			}
			String time=getTime();
			String ip=ReceivePacket.getAddress().getHostAddress();
			String message=new String(arr,0,len);
			String str = time+":"+ip+"对我说:\r\n"+message+"\r\n\r\n";
			dw.write(str);
			toptext.append(str);
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	   }
    }
	public static void main(String[] args) {
    new GuiChat();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值