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; } }
java 一个聊天小工具
猜你喜欢
转载自www.cnblogs.com/wbyixx/p/9472267.html
今日推荐
周排行