简单聊天工具

package com.tian_8_22;


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 Demo2_GUIChat extends Frame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private TextField tf;
    private Button send;
    private Button log;
    private Button clear;
    private Button shake;
    private TextArea viewText;
    private TextArea sendText;
    private DatagramSocket socket;
    private BufferedWriter bw ;
    public Demo2_GUIChat() {
        init();
        southPanel();
        centerPanel();
        event();

    }
    public void event() {
        this.addWindowListener(new WindowAdapter() {
             @Override
            public void windowClosing(WindowEvent e) {
                 try {
                    socket.close();
                     bw.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                System.exit(0);
            }
        });
        send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    send();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

        });
        log.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                    try {
                        logFile();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
            }
        });
        clear.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                viewText.setText("");
            }
        });
        shake.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    send(new byte[] {-1},tf.getText());
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

        });
        sendText.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //if(e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) {  //按center+回车键发送信息
                if(e.getKeyCode() == KeyEvent.VK_ENTER ) {                        //按enter键发送信息
                    try {
                        send();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        });
    }

    private void shake() {
        int x = this.getLocation().x;           //获取横坐标位置    
        int y = this.getLocation().y;           //获取总坐标位置

        for(int i= 0;i <5;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();
            }
        }

    }


    private void logFile() throws IOException {
            bw.flush();//刷新缓冲区
            FileInputStream fis = new FileInputStream("config.txt");
            ByteArrayOutputStream bos = new ByteArrayOutputStream(); //在内存中创建缓冲区
            int  len;
            byte[] arr = new byte[8192];
            while((len = fis.read(arr)) != -1) {
                bos.write(arr,0,len);
            }

            String str = bos.toString(); 
            viewText.setText(str);
            fis.close();
    }
    private void send(byte[] arr,String ip) throws IOException {
        DatagramPacket packet = 
                new DatagramPacket(arr, arr.length,InetAddress.getByName(ip),9999);
        socket.send(packet);
    }
    private void send() throws IOException {
        String message = sendText.getText(); //获取发送区域的内容
        String ip = tf.getText();            //获取IP地址

        ip = ip.trim().length() == 0 ? "255.255.255.255":ip;

        send(message.getBytes(), ip);

        String time = getCurrentTime();
        //viewText.append(time+" 我对:"+ip+" 说\r\n"+message+"\r\n\r\n");           //将信息添加到显示区域中
        String str = time+" 我对:"+(ip.equals("255.255.255.255") ? "所有人":ip)+"说\r\n"+message+"\r\n\r\n";
        viewText.append(str);  
        bw.write(str);                  //将信息写到数据库(文本文档)中
        sendText.setText("");
    }
    private String getCurrentTime() {
        Date d  = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  a HH:mm:ss");

        return sdf.format(d);
    }

    public void centerPanel() {
        Panel center = new Panel();             //创建中间的panel
        viewText = new TextArea();
        sendText = new TextArea(5,1);
        center.setLayout(new BorderLayout());   //设置为边界布局管理器
        center.add(sendText, BorderLayout.SOUTH);
        center.add(viewText, BorderLayout.CENTER);
        viewText.setEditable(false);            //将显示的文本区域设置为不可编辑的
        viewText.setBackground(Color.white);    //设置背景颜色
        sendText.setFont(new Font("xxx", Font.PLAIN, 15));
        viewText.setFont(new Font("xxx", Font.PLAIN, 15));
        this.add(center,BorderLayout.CENTER);

    }
    public void southPanel() {
        Panel south = new Panel();              //创建南边的panel
        tf = new TextField(16);
        tf.setText("127.0.0.1");
        send = new Button("send");  //发送
        log = new Button("log");    //记录
        clear = new Button("clear");//清屏
        shake = new Button("shake");//震动

        south.add(tf);
        south.add(send);
        south.add(log);
        south.add(clear);
        south.add(shake);

        this.add(south,BorderLayout.SOUTH);



    }
    public void init() {
        this.setLocation(500,50);
        this.setSize(400, 600);
        new Receive().start();
        try {
            socket = new DatagramSocket();
            bw = new BufferedWriter(new FileWriter("config.txt",true)); //在尾部追加
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.setVisible(true);
    }

    private class Receive extends Thread{
        @Override
        public void run() {
            try {
                DatagramSocket socket = new DatagramSocket(9999);
                DatagramPacket packet = new DatagramPacket(new byte[8192], 8192);

                while(true) {
                    socket.receive(packet);         //接收信息
                    byte[] arr = packet.getData();
                    int len = packet.getLength();
                    if(arr[0] == -1 && len == 1) {  //如果发过来的数组第一个存储的值是-1,并且数组长度是1
                        shake();                    //调用震动方法
                        continue;                   //终止本次循环继续下次循环,因为震动后不需要执行下面的代码
                    }
                    String message = new String(arr, 0, len);   //转换成字符串

                    String time =getCurrentTime();
                    String ip = packet.getAddress().getHostAddress();
                    String str = time+" "+ip+"  对我说:\r\n"+message+"\r\n\r\n";
                    viewText.append(str);
                    bw.write(str);

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new Demo2_GUIChat();


    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值