本帖最后由 xtxiaolu 于 2014-4-23 10:51 编辑 纯java做的小聊天工具虽然不是很完善,但是带你领略一下java的神奇之处 - 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 GUI_Chat extends Frame {
- 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;
- /**
- * @param args
- */
- public GUI_Chat() {
- init();
- southPanel();
- centerPanel();
- event();
- }
- private void event() {
- this.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) { // 在窗体上添加关闭的事件
- try {
- bw.close();
- socket.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- System.exit(0);
- }
- });
- send.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- send();
- }
- });
- clear.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- viewText.setText("");
- }
- });
- log.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- logFile();
- }
- });
- shake.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- send(new byte[]{-1},tf.getText());
- }
- });
-
- sendText.addKeyListener(new KeyAdapter() {
- @Override
- public void keyReleased(KeyEvent e) {
- if(e.getKeyCode() == KeyEvent.VK_ENTER ) {
- send();
- }
- }
- });
- }
- private void shake() {
- int x = this.getLocation().x;
- int y = this.getLocation().y;
- try {
- 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);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- private void logFile() {
- try {
- bw.flush();
- FileInputStream fis = new FileInputStream("log.txt"); // 读log.txt
- ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 创建字节数组输出流
- int len;
- byte[] arr = new byte[1024];
- while ((len = fis.read(arr)) != -1) {
- baos.write(arr, 0, len); // 将读到的信息写到内存里
- }
- String message = new String(baos.toByteArray()); // 将内存的数据转换为字符串
- viewText.setText(message); // 将显示的区域设置为读到的数据
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void send(byte[] arr,String ip) {
- try {
- DatagramPacket packet =
- new DatagramPacket(arr, arr.length,InetAddress.getByName(ip), 12345);
- socket.send(packet);
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- }
-
- private void send() {
- String message = sendText.getText(); // 获取发送区域的信息
- String ip = tf.getText(); // 获取TextField里面的信息,也就是ip
- ip = ip.trim().length() == 0 ? "255.255.255.255" : ip;
- try {
- send(message.getBytes(),ip);
- String time = getCurrentTime();
- 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("");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private String getCurrentTime() {
- Date d = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
- return sdf.format(d); // 将时间以字符串的形式返回
- }
- private void centerPanel() {
- Panel center = new 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("仿宋", Font.PLAIN, 15)); // 设置发送窗口的的字体
- viewText.setFont(new Font("仿宋", Font.PLAIN, 15));
- this.add(center, BorderLayout.CENTER); // 将面板添加到Frame的中间的位置
- }
- private void southPanel() {
- Panel 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(tf); // 将文本字段添加到panel中
- south.add(send); // 将按钮添加到panel中
- south.add(log);
- south.add(clear);
- south.add(shake);
- this.add(south, BorderLayout.SOUTH); // 将panel添加到frame窗口的南边
- }
- private void init() {
- this.setLocation(500, 100);
- this.setSize(380, 450);
- new Receive().start();
- try {
- socket = new DatagramSocket();
- bw = new BufferedWriter(new FileWriter("log.txt", true)); // 将聊天记录写到log.txt中
- } catch (IOException e) {
- e.printStackTrace();
- }
- this.setVisible(true);
- }
- private class Receive extends Thread {
- public void run() {
- try {
- DatagramSocket socket = new DatagramSocket(12345); // 创建socket对象
- DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);// 创建接收的packet
- while (true) {
- socket.receive(packet); // 不断的接收
- int len = packet.getLength(); // 获取有效的字节个数
- byte[] arr = packet.getData(); // 获取数据
- if(len == 1 && arr[0] == -1) {
- shake();
- continue;
- }
- String ip = packet.getAddress().getHostAddress(); // 获取ip
- String time = getCurrentTime(); // 获取当前时间
- String message = new String(arr, 0, len); // 将获取的字节数据转换为字符串
- 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 GUI_Chat();
- }
- }
复制代码
想和童鞋们聊天的话吧下面IP地址改一下就行,必须要有内网!
请大家带走的同时希望童鞋们多多回帖多多支持!{:3_56:}
|
|