A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xtxiaolu 中级黑马   /  2014-4-23 10:31  /  1214 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xtxiaolu 于 2014-4-23 10:51 编辑
纯java做的小聊天工具虽然不是很完善,但是带你领略一下java的神奇之处
  1. import java.awt.BorderLayout;
  2. import java.awt.Button;
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Frame;
  6. import java.awt.Panel;
  7. import java.awt.TextArea;
  8. import java.awt.TextField;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.event.KeyAdapter;
  12. import java.awt.event.KeyEvent;
  13. import java.awt.event.WindowAdapter;
  14. import java.awt.event.WindowEvent;
  15. import java.io.BufferedWriter;
  16. import java.io.ByteArrayOutputStream;
  17. import java.io.FileInputStream;
  18. import java.io.FileWriter;
  19. import java.io.IOException;
  20. import java.net.DatagramPacket;
  21. import java.net.DatagramSocket;
  22. import java.net.InetAddress;
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;

  25. public class GUI_Chat extends Frame {

  26.         private TextField tf;
  27.         private Button send;
  28.         private Button log;
  29.         private Button clear;
  30.         private Button shake;
  31.         private TextArea viewText;
  32.         private TextArea sendText;
  33.         private DatagramSocket socket;
  34.         private BufferedWriter bw;

  35.         /**
  36.          * @param args
  37.          */
  38.         public GUI_Chat() {
  39.                 init();
  40.                 southPanel();
  41.                 centerPanel();
  42.                 event();
  43.         }

  44.         private void event() {
  45.                 this.addWindowListener(new WindowAdapter() {
  46.                         @Override
  47.                         public void windowClosing(WindowEvent e) { // 在窗体上添加关闭的事件
  48.                                 try {
  49.                                         bw.close();
  50.                                         socket.close();
  51.                                 } catch (IOException e1) {

  52.                                         e1.printStackTrace();
  53.                                 }
  54.                                 System.exit(0);
  55.                         }
  56.                 });

  57.                 send.addActionListener(new ActionListener() {

  58.                         @Override
  59.                         public void actionPerformed(ActionEvent e) {
  60.                                 send();
  61.                         }

  62.                 });

  63.                 clear.addActionListener(new ActionListener() {

  64.                         @Override
  65.                         public void actionPerformed(ActionEvent e) {
  66.                                 viewText.setText("");
  67.                         }
  68.                 });

  69.                 log.addActionListener(new ActionListener() {

  70.                         @Override
  71.                         public void actionPerformed(ActionEvent e) {
  72.                                 logFile();
  73.                         }

  74.                 });

  75.                 shake.addActionListener(new ActionListener() {

  76.                         @Override
  77.                         public void actionPerformed(ActionEvent e) {
  78.                                 send(new byte[]{-1},tf.getText());
  79.                         }

  80.                 });
  81.                
  82.                 sendText.addKeyListener(new KeyAdapter() {
  83.                         @Override
  84.                         public void keyReleased(KeyEvent e) {
  85.                                 if(e.getKeyCode() == KeyEvent.VK_ENTER ) {
  86.                                         send();
  87.                                 }
  88.                         }
  89.                 });
  90.         }

  91.         private void shake() {
  92.                 int x = this.getLocation().x;
  93.                 int y = this.getLocation().y;
  94.                 try {
  95.                         for (int i = 0; i < 20; i++) {
  96.                                 this.setLocation(x + 20, y + 20);
  97.                                 Thread.sleep(20);
  98.                                 this.setLocation(x - 20, y - 20);
  99.                                 Thread.sleep(20);
  100.                                 this.setLocation(x + 20, y - 20);
  101.                                 Thread.sleep(20);
  102.                                 this.setLocation(x - 20, y + 20);
  103.                                 Thread.sleep(20);
  104.                                 this.setLocation(x, y);
  105.                         }
  106.                 } catch (InterruptedException e) {

  107.                         e.printStackTrace();
  108.                 }
  109.         }

  110.         private void logFile() {
  111.                 try {
  112.                         bw.flush();
  113.                         FileInputStream fis = new FileInputStream("log.txt"); // 读log.txt
  114.                         ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 创建字节数组输出流
  115.                         int len;
  116.                         byte[] arr = new byte[1024];
  117.                         while ((len = fis.read(arr)) != -1) {
  118.                                 baos.write(arr, 0, len); // 将读到的信息写到内存里
  119.                         }
  120.                         String message = new String(baos.toByteArray()); // 将内存的数据转换为字符串
  121.                         viewText.setText(message); // 将显示的区域设置为读到的数据
  122.                 } catch (IOException e) {

  123.                         e.printStackTrace();
  124.                 }
  125.         }
  126.        
  127.         public void send(byte[] arr,String ip) {
  128.                 try {
  129.                         DatagramPacket packet =
  130.                                         new DatagramPacket(arr, arr.length,InetAddress.getByName(ip), 12345);
  131.                                         socket.send(packet);
  132.                 } catch (IOException e) {
  133.                        
  134.                         e.printStackTrace();
  135.                 }
  136.         }
  137.        
  138.         private void send() {
  139.                 String message = sendText.getText(); // 获取发送区域的信息
  140.                 String ip = tf.getText(); // 获取TextField里面的信息,也就是ip
  141.                 ip = ip.trim().length() == 0 ? "255.255.255.255" : ip;

  142.                 try {
  143.                         send(message.getBytes(),ip);
  144.                         String time = getCurrentTime();
  145.                         String str = time + " 我对 " + (ip.equals("255.255.255.255")? "所有人" : ip) + "说:\r\n" + message + "\r\n\r\n";
  146.                         viewText.append(str); // 将说的内容显示在显示的文本区域
  147.                         bw.write(str);
  148.                         sendText.setText("");
  149.                 } catch (Exception e) {

  150.                         e.printStackTrace();
  151.                 }
  152.         }

  153.         private String getCurrentTime() {
  154.                 Date d = new Date();
  155.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  156.                 return sdf.format(d); // 将时间以字符串的形式返回
  157.         }

  158.         private void centerPanel() {
  159.                 Panel center = new Panel(); // 创建中间面板
  160.                 viewText = new TextArea();
  161.                 sendText = new TextArea(5, 1);
  162.                 center.setLayout(new BorderLayout()); // 将布局管理器设置为边界布局管理器
  163.                 center.add(sendText, BorderLayout.SOUTH); // 将发送的添加到南边
  164.                 center.add(viewText, BorderLayout.CENTER); // 将显示的添加到中间
  165.                 viewText.setEditable(false); // 将显示窗口设置为不可以编辑
  166.                 viewText.setBackground(Color.WHITE); // 将显示的窗口的背景颜色设置为白色
  167.                 sendText.setFont(new Font("仿宋", Font.PLAIN, 15)); // 设置发送窗口的的字体
  168.                 viewText.setFont(new Font("仿宋", Font.PLAIN, 15));
  169.                 this.add(center, BorderLayout.CENTER); // 将面板添加到Frame的中间的位置
  170.         }

  171.         private void southPanel() {
  172.                 Panel south = new Panel(); // 创建南边的面板
  173.                 tf = new TextField(15);
  174.                 tf.setText("127.0.0.1"); // 设置文件字段的初始值
  175.                 send = new Button("发 送");
  176.                 log = new Button("记 录");
  177.                 clear = new Button("清 屏");
  178.                 shake = new Button("震 动");

  179.                 south.add(tf); // 将文本字段添加到panel中
  180.                 south.add(send); // 将按钮添加到panel中
  181.                 south.add(log);
  182.                 south.add(clear);
  183.                 south.add(shake);

  184.                 this.add(south, BorderLayout.SOUTH); // 将panel添加到frame窗口的南边
  185.         }

  186.         private void init() {
  187.                 this.setLocation(500, 100);
  188.                 this.setSize(380, 450);
  189.                 new Receive().start();
  190.                 try {
  191.                         socket = new DatagramSocket();
  192.                         bw = new BufferedWriter(new FileWriter("log.txt", true)); // 将聊天记录写到log.txt中
  193.                 } catch (IOException e) {

  194.                         e.printStackTrace();
  195.                 }

  196.                 this.setVisible(true);
  197.         }

  198.         private class Receive extends Thread {
  199.                 public void run() {
  200.                         try {
  201.                                 DatagramSocket socket = new DatagramSocket(12345); // 创建socket对象
  202.                                 DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);// 创建接收的packet

  203.                                 while (true) {
  204.                                         socket.receive(packet); // 不断的接收
  205.                                         int len = packet.getLength(); // 获取有效的字节个数
  206.                                         byte[] arr = packet.getData(); // 获取数据
  207.                                         if(len == 1 && arr[0] == -1) {
  208.                                                 shake();
  209.                                                 continue;
  210.                                         }
  211.                                         String ip = packet.getAddress().getHostAddress(); // 获取ip
  212.                                         String time = getCurrentTime(); // 获取当前时间
  213.                                         String message = new String(arr, 0, len); // 将获取的字节数据转换为字符串
  214.                                         String str = time + " " + ip + " 对我说:\r\n" + message
  215.                                                         + "\r\n\r\n";
  216.                                         viewText.append(str); // 将字符串添加到显示的区域
  217.                                         bw.write(str); // 将字符串写到文件上
  218.                                 }
  219.                         } catch (Exception e) {

  220.                                 e.printStackTrace();
  221.                         }
  222.                 }
  223.         }

  224.         public static void main(String[] args) {
  225.                 new GUI_Chat();
  226.         }

  227. }
复制代码






想和童鞋们聊天的话吧下面IP地址改一下就行,必须要有内网!
请大家带走的同时希望童鞋们多多回帖多多支持!{:3_56:}


GUI_Chat.zip

2.47 KB, 阅读权限: 10, 下载次数: 10

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

3 个回复

倒序浏览
顶,谢谢分享
回复 使用道具 举报
顶起 不错!!!!!!!!!!!!!!!
回复 使用道具 举报
谢谢分享,学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马