java 一个聊天小工具

package wby;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
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.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.net.URL;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) throws Exception {
        new GUIChat();
    }
}

class GUIChat extends Frame {
    private TextField tf;
    private Button send;
    private Button log;
    private Button clear;
    private Button shake;
    private TextArea sendText;
    private TextArea viewText;
    private Panel center;
    private Panel south;
    private DatagramSocket socket;
    private BufferedWriter bw;

    public GUIChat() throws UnknownHostException, SocketException {
        init();
        southPanel();
        centerPanel();
        event();
    }
    
    private void event() {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                try {
                    bw.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                socket.close();
                System.exit(0);
            }
        });
        
        //发送按钮监听
        send.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    send();
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }    
            }
        });
                
        //记录按钮监听
        log.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub    
                try {
                    logFile();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                viewText.setText("");
            }
        });
        
        shake.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                try {
                    send(new byte[] {-1}, tf.getText());
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        });
        
        sendText.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) {
                    try {
                        send();
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
            }
        });
    }
    
    private void shake() throws InterruptedException {
        int x = this.getLocation().x;
        int y = this.getLocation().y;
        
        for(int i = 0; i< 20; i++) {
            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);
    }
    
    private void logFile() throws IOException {
        // TODO Auto-generated method stub
        bw.flush();
        FileInputStream fis = new FileInputStream("config.txt");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        
        int len;
        byte[] arr = new byte[8192];
        while((len = fis.read(arr)) != -1) {
            baos.write(arr, 0, len);
        }
        
        String str = baos.toString();
        viewText.setText(str);
        
        fis.close();
        baos.close();
    }
    
    private class Receive extends Thread {
        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) {
                        shake();
                        continue;
                    }
                    String message = new String(arr, 0, len); 
                    String ip = packet.getAddress().getHostAddress();
                    String msg = ip + ": \n" + message + "\n\n";
                    viewText.append(msg);
                    bw.write(msg);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
    
    private void send(byte[] arr, String ip) throws Exception {
        DatagramPacket packet = 
                new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 9999);
        socket.send(packet);
    }
    
    private void send() throws Exception {
        String message = sendText.getText();
        String ip = tf.getText();
        DatagramPacket packet = 
                new DatagramPacket(message.getBytes(), message.getBytes().length, InetAddress.getByName(ip), 9999);
        socket.send(packet);
        String time = getCurrentTime();
        String msg = ip + ": \n" + message + "\n\n";
        viewText.append(msg);
        bw.write(msg);
        sendText.setText("");
    }
    
    private String getCurrentTime() {
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH:mm:ss");
        return sdf.format(d);
    }

    private void centerPanel() {
        center = new Panel();
        viewText = new TextArea();
        sendText = new TextArea(5, 1);
        viewText.setEditable(false);  
        viewText.setBackground(Color.WHITE);
        sendText.setFont(new Font("微软雅黑",Font.PLAIN, 15));
        viewText.setFont(new Font("微软雅黑",Font.PLAIN, 15));
        center.setLayout(new BorderLayout());
        center.add(sendText, BorderLayout.SOUTH);
        center.add(viewText, BorderLayout.CENTER);
        this.add(center, BorderLayout.CENTER);
    }
    
    private void southPanel() {
        Label text = new Label("对方ip");
        south = new Panel();
        tf = new TextField(15);
        tf.setText("127.0.0.1");
        send = new Button("发送");
        log = new Button("记录");
        clear = new Button("清屏");
        shake = new Button("震动");
        south.add(text);
        south.add(tf);
        south.add(send);
        south.add(log);
        south.add(clear);
        south.add(shake);
        this.add(south, BorderLayout.SOUTH);
    }
    
    private void init() {
        try {
            socket = new DatagramSocket();
            bw = new BufferedWriter(new FileWriter("config.txt", true));
        } catch (Exception e) {
            // TODO: handle exception
        }
        new Receive().start();
        this.setLocation(500, 50);
        this.setSize(400, 600);
        this.setVisible(true);
        this.setTitle(getV4IP());
        
    }
    
    //用于获取系统的外网ip地址
    public static String getV4IP(){
        String ip = "";
        String chinaz = "http://ip.chinaz.com";
        
        StringBuilder inputLine = new StringBuilder();
        String read = "";
        URL url = null;
        HttpURLConnection urlConnection = null;
        BufferedReader in = null;
        try {
            url = new URL(chinaz);
            urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
            while((read=in.readLine())!=null){
                inputLine.append(read+"\r\n");
            }
            //System.out.println(inputLine.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
        
        Pattern p = Pattern.compile("\\<dd class\\=\"fz24\">(.*?)\\<\\/dd>");
        Matcher m = p.matcher(inputLine.toString());
        if(m.find()){
            String ipstr = m.group(1);
            ip = ipstr;
            //System.out.println(ipstr);
        }
        return ip;
    }
}

猜你喜欢

转载自www.cnblogs.com/wbyixx/p/9472267.html