简易聊天小程序(java源代码)


前言


自己摸索写出来的,利用内网穿透可以实现不同局域网之间实现信息交换,还有一些小问题,待改进

提示:以下是本篇文章正文内容,下面案例可供参考
在这里插入图片描述

一、GUIServer

package socket;

import javax.swing.*;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 服务器端窗口,先运行这个
 */
public class GUIServer {
    
    

    public static void main(String[] args) {
    
    
        // 创建窗体
        JFrame f = new JFrame("服务器");
        f.setLayout(null);
        // 设置大小和位置
        f.setSize(400, 730);
        f.setLocation(100, 200);

        JButton b = new JButton("发送");
        b.setBounds(290, 620, 80, 30);
        f.add(b);

        JTextField tf = new JTextField();
        tf.setBounds(10, 620, 260, 30);
        f.add(tf);
        JTextArea ta = new JTextArea();
        ta.setBounds(10, 40, 360, 400);
        ta.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(ta);
        scrollPane.setBounds(10, 40, 360, 400);
        //f.add(ta);
        f.add(scrollPane);
        JLabel label = new JLabel("表情:");
        label.setBounds(220, 520, 60, 40);
        f.add(label);
        JComboBox comboBox1 = new JComboBox();
        comboBox1.setBounds(260, 520, 60, 40);
        comboBox1.addItem("微笑地");
        comboBox1.addItem("生气地");
        comboBox1.addItem("开心地");
        f.add(comboBox1);
        JLabel label1 = new JLabel("发送至:");
        label1.setBounds(10, 520, 60, 40);
        f.add(label1);
        JComboBox comboBox2 = new JComboBox();
        comboBox2.setBounds(50, 520, 80, 40);
        comboBox2.addItem("所有人");
        comboBox2.addItem("我");
        comboBox2.addItem("127.0.0.1");
        comboBox2.addItem("流光");
        f.add(comboBox2);
        JComboBox comboBox3 = new JComboBox();
        comboBox3.setBounds(200, 320, 80, 40);
        comboBox3.addItem("127.0.0.1");
        comboBox3.addItem("我");
        comboBox3.addItem("流光");
        JCheckBox checkBox1 = new JCheckBox("悄悄话");
        checkBox1.setBounds(300, 560, 80, 40);
        f.add(checkBox1);

        JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
        f.setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中

        JMenu menu = new JMenu("Menu");// 创建菜单对象
        menuBar.add(menu);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象
        //  menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu.add(menuItem);// 将菜单项对象添加到菜单对象中

        JMenu sonMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象
        menu.add(sonMenu);// 将子菜单对象添加到上级菜单对象中

        JMenuItem sonMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单的菜单项对象
        //     sonMenuItem.addActionListener(new ItemListener());

        sonMenu.add(sonMenuItem);// 将子菜单的菜单项对象添加到子菜单对象中

        JMenu menu2 = new JMenu("File");// 创建菜单对象
        menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem2 = new JMenuItem("菜单项名称2");// 创建菜单项对象
        //   menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu2.add(menuItem2);// 将菜单项对象添加到菜单对象中

        JMenu sonMenu2 = new JMenu("子菜单名称2");// 创建菜单的子菜单对象
        menu2.add(sonMenu2);// 将子菜单对象添加到上级菜单对象中

        JMenuItem sonMenuItem2 = new JMenuItem("子菜单项名称2");// 创建子菜单的菜单项对象
        //   sonMenuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        sonMenu2.add(sonMenuItem2);// 将子菜单的菜单项对象添加到子菜单对象中
        JMenu menu3 = new JMenu("Tools");// 创建菜单对象
        menuBar.add(menu3);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem3 = new JMenuItem("菜单项名称2");// 创建菜单项对象
        //   menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu2.add(menuItem3);// 将菜单项对象添加到菜单对象中
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setVisible(true);
        tf.requestFocus();
        try {
    
    
            ServerSocket ss=new ServerSocket(8888);
            //ServerSocket ss=new ServerSocket();
            Socket s=ss.accept();
            tf.addActionListener(new ActionListener() {
    
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
    
                    // 获取输入文本
                    String text = tf.getText();
                    String text1 = comboBox1.getSelectedItem().toString();
                    String text2 = comboBox2.getSelectedItem().toString();
                    String text4 = "";
                    if (checkBox1.isSelected()) {
    
    
                        text4 = checkBox1.getText();
                    }
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                    String now = sdf.format(date);
                    String finalText = text4;
                    ta.append(now + "\r\n" + "系统消息" + text1 + finalText + "对" + text2 + "说:" + text + "\r\n");//text4
                    ta.setCaretPosition(ta.getText().length());
                    // 设置输入框为空
                    tf.setText("");
                    // 发送信息
                    try {
    
    
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                        dos.writeUTF("系统消息" + text1 + finalText + "对" + text2 + "说:" + text);
                    } catch (IOException e1) {
    
    
                        e1.printStackTrace();
                    }
                }
            });
        b.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                // 获取输入文本
                String text = tf.getText();
                String text1 = comboBox1.getSelectedItem().toString();
                String text2 = comboBox2.getSelectedItem().toString();
                String text4 = "";
                if (checkBox1.isSelected()) {
    
    
                    text4 = checkBox1.getText();
                }
                Date date = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                String now = sdf.format(date);
                String finalText = text4;
                ta.append(now + "\r\n" + "系统消息" + text1 + finalText + "对" + text2 + "说:" + text + "\r\n");//text4
                ta.setCaretPosition(ta.getText().length());
                // 设置输入框为空
                tf.setText("");
                // 发送信息
                try {
    
    
                    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                    dos.writeUTF("系统消息" + text1 + finalText + "对" + text2 + "说:" + text);
                } catch (IOException e1) {
    
    
                    e1.printStackTrace();
                }
            }
        });
        // 接收信息线程
        new Thread() {
    
    
            Boolean online=true;
            @Override
            public void run() {
    
    
                while (online) {
    
    
                    try {
    
    
                        // 获取其他用户的输入
                        DataInputStream dis = new DataInputStream(s.getInputStream());
                        String text = dis.readUTF();
                        //String ip = s.getInetAddress().getHostAddress();
                        Date date = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                        String now = sdf.format(date);
                        // 添加到页面上
                        // ta.append(now + "\r\n" + ip + ":" + text + "\r\n");
                        ta.append(now + "\r\n" + text + "\r\n");
                        ta.setCaretPosition(ta.getText().length());
                    } catch (IOException e) {
    
    
                        online=false;
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    } catch(IOException e)
    {
    
    
        e.printStackTrace();
    }
}
}


二、GUIClient

package socket;

import javax.swing.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 客户端程序
 */
public class GUIClient {
    
    
    public static <ServletRequestAttributes, HttpServletRequest> void main(String[] args) {
    
    
        // 创建窗体
        JFrame f = new JFrame("客户端");
        f.setLayout(null);
        // 设置大小和位置
        f.setSize(400, 530);
        f.setLocation(100, 200);
        JButton b = new JButton("发送");
        b.setBounds(290, 420, 80, 30);
        f.add(b);

        JTextField tf = new JTextField();
        tf.setBounds(10, 420, 260, 30);
        f.add(tf);
        JTextArea ta = new JTextArea();
        ta.setBounds(10, 40, 360, 200);
        ta.setEditable(false);
        JScrollPane scrollPane=new JScrollPane(ta);
        scrollPane.setBounds(10,40,360,200);
        //f.add(ta);
        f.add(scrollPane);

        JLabel label=new JLabel("表情:");
        label.setBounds(280,320,60,40);
        f.add(label);
        JComboBox comboBox1=new JComboBox();
        comboBox1.setBounds(320,320,60,40);
        comboBox1.addItem("微笑地");
        comboBox1.addItem("生气地");
        comboBox1.addItem("开心地");
        f.add(comboBox1);

        JLabel label1=new JLabel("发送至:");
        label1.setBounds(10,320,60,40);
        f.add(label1);
        JComboBox comboBox2=new JComboBox();
        comboBox2.setBounds(50,320,80,40);
        comboBox2.addItem("所有人");
        comboBox2.addItem("我");
        comboBox2.addItem("127.0.0.1");
        comboBox2.addItem("流光");
        f.add(comboBox2);
        JLabel label2=new JLabel("选择用户:");
        label2.setBounds(140,320,60,40);
        f.add(label2);
        JComboBox comboBox3=new JComboBox();
        comboBox3.setBounds(200,320,80,40);
        comboBox3.addItem("127.0.0.1");
        comboBox3.addItem("我");
        comboBox3.addItem("流光");
        f.add(comboBox3);
        JCheckBox checkBox1=new JCheckBox("悄悄话");
        checkBox1.setBounds(300,360,80,40);
        f.add(checkBox1);

        JMenuBar menuBar = new JMenuBar();// 创建菜单栏对象
        f.setJMenuBar(menuBar);// 将菜单栏对象添加到窗体的菜单栏中

        JMenu menu = new JMenu("Menu");// 创建菜单对象
        menuBar.add(menu);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象
      //  menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu.add(menuItem);// 将菜单项对象添加到菜单对象中

        JMenu sonMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象
        menu.add(sonMenu);// 将子菜单对象添加到上级菜单对象中

        JMenuItem sonMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单的菜单项对象
   //     sonMenuItem.addActionListener(new ItemListener());

        sonMenu.add(sonMenuItem);// 将子菜单的菜单项对象添加到子菜单对象中

        JMenu menu2 = new JMenu("File");// 创建菜单对象
        menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem2 = new JMenuItem("菜单项名称2");// 创建菜单项对象
     //   menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu2.add(menuItem2);// 将菜单项对象添加到菜单对象中

        JMenu sonMenu2 = new JMenu("子菜单名称2");// 创建菜单的子菜单对象
        menu2.add(sonMenu2);// 将子菜单对象添加到上级菜单对象中

        JMenuItem sonMenuItem2 = new JMenuItem("子菜单项名称2");// 创建子菜单的菜单项对象
     //   sonMenuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        sonMenu2.add(sonMenuItem2);// 将子菜单的菜单项对象添加到子菜单对象中
        JMenu menu3 = new JMenu("Tools");// 创建菜单对象
        menuBar.add(menu3);// 将菜单对象添加到菜单栏对象中

        JMenuItem menuItem3 = new JMenuItem("菜单项名称2");// 创建菜单项对象
        //   menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器
        menu2.add(menuItem3);// 将菜单项对象添加到菜单对象中

        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setVisible(true);
        tf.requestFocus();
        try {
    
    
            //Socket s = new Socket("127.0.0.1", 8888);
            Socket s=new Socket("40p56s2784.qicp.vip",20237);
            tf.addActionListener(new ActionListener() {
    
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
    
                    // 获取输入文本
                    String text = tf.getText();
                    String text1 = comboBox1.getSelectedItem().toString();
                    String text2 = comboBox2.getSelectedItem().toString();
                    String text3=(String)comboBox3.getSelectedItem();
                    String text4 = "";
                    if (checkBox1.isSelected()) {
    
    
                        text4 = checkBox1.getText();
                    }
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                    String now = sdf.format(date);
                    String finalText = text4;
                    ta.append(now +"\r\n"+text3+ finalText +text1+"对"+text2 + "说:"+text + "\r\n");
                    ta.setCaretPosition(ta.getText().length());
                    // 设置输入框为空
                    tf.setText("");
                    // 发送信息
                    try {
    
    
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                        dos.writeUTF(text3+text4+text1+"对"+text2 + "说:"+text );
                    } catch (IOException e1) {
    
    
                        e1.printStackTrace();
                    }
                }
            });
            b.addActionListener(new ActionListener() {
    
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
    
                    // 获取输入文本
                    String text = tf.getText();
                    String text1= (String) comboBox1.getSelectedItem();
                    String text2=(String)comboBox2.getSelectedItem();
                    String text3=(String)comboBox3.getSelectedItem();
                    String text4="";
                    if(checkBox1.isSelected()){
    
    
                    text4=checkBox1.getText();}
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                    String now = sdf.format(date);
                    String finalText = text4;
                    ta.append(now +"\r\n"+text3+ finalText +text1+"对"+text2 + "说:"+text + "\r\n");
                    // 设置输入框为空
                    tf.setText("");
                    // 发送信息
                    try {
    
    
                        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
                        s.shutdownOutput();
                        dos.writeUTF(text3+text4+text1+"对"+text2 + "说:"+text );
                    } catch (IOException e1) {
    
    
                        e1.printStackTrace();
                    }
                }
            });
            try {
    
    
                // 接收信息线程
                new Thread() {
    
    
                    Boolean online=true;
                    @Override
                    public void run() {
    
    
                        while (online) {
    
    
                            try {
    
    
                                // 获取其他用户的输入
                                DataInputStream dis = new DataInputStream(s.getInputStream());
                                String text = dis.readUTF();
                                //String ip = s.getInetAddress().getHostAddress();
                                Date date = new Date();
                                SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm:ss");
                                String now = sdf.format(date);
                                // 添加到页面上
                                // ta.append(now + "\r\n" + ip + ":" + text + "\r\n");
                                ta.append(now + "\r\n" + text + "\r\n");
                            } catch (IOException e) {
    
    
                             //   online=false;
                                e.printStackTrace();
                            }
                        }
                    }
                }.start();
            }catch (Exception e){
    
    
                e.printStackTrace();
            }

        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

}


猜你喜欢

转载自blog.csdn.net/qq_45879198/article/details/118083774