⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientframe.java~21~

📁 Java 聊天程序 有客户端和服务端。
💻 JAVA~21~
📖 第 1 页 / 共 2 页
字号:
package chatclient;

//增加的包
import java.io.*;
import java.net.*;
import java.util.*;

import java.awt.*;
import java.awt.List;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

import com.borland.jbcl.layout.*;
import sun.audio.*;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import java.awt.Color;

/**
 * <p>Title: 聊天系统客户端</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: 个人</p>
 * @author Mothz
 * @version 1.0
 */

public class ClientFrame
    extends JFrame {
    JPanel contentPane;
    JButton jButton1 = new JButton();
    JButton jButton2 = new JButton();
    JTextField jTextField2 = new JTextField();
    JLabel jLabel2 = new JLabel();
    List list1 = new List();
    JRadioButton jRadioButton1 = new JRadioButton();
    JRadioButton jRadioButton2 = new JRadioButton();
    ButtonGroup buttonGroup1 = new ButtonGroup();
    JTextArea chat2 = new JTextArea();
    //定义数据流和网络变量
    Socket socket = null; //定义连接套接字
    DataInputStream dis = null;
    //用来实现客户端接受服务器的数据的输入流
    DataOutputStream dos = null;
    //用来实现客户端向服务器的输出流
    Listen listen = null; //定义客户端线程
    boolean notEnd = true;
    int count = 0;
    String name = null;
    JPanel jPanel3 = new JPanel();
    PaneLayout paneLayout1 = new PaneLayout();
    JPanel jPanel4 = new JPanel();
    JPanel jPanel5 = new JPanel();
    JScrollPane jScrollPane3 = new JScrollPane();
    BorderLayout borderLayout1 = new BorderLayout();
    PaneLayout paneLayout2 = new PaneLayout();
    JPanel jPanel6 = new JPanel();
    JPanel jPanel7 = new JPanel();
    JPanel jPanel8 = new JPanel();
    JPanel jPanel9 = new JPanel();
    PaneLayout paneLayout3 = new PaneLayout();
    JPanel jPanel10 = new JPanel();
    JPanel jPanel11 = new JPanel();
    BorderLayout borderLayout2 = new BorderLayout();
    JScrollPane jScrollPane1 = new JScrollPane();
    JScrollPane jScrollPane2 = new JScrollPane();
    BorderLayout borderLayout3 = new BorderLayout();
    JTextArea chat1 = new JTextArea();
    FlowLayout flowLayout2 = new FlowLayout();
    JPanel jPanel2 = new JPanel();
    FlowLayout flowLayout3 = new FlowLayout();
    BorderLayout borderLayout4 = new BorderLayout();
    JLabel jLabel1 = new JLabel();
    FlowLayout flowLayout4 = new FlowLayout();
    JLabel jLabel3 = new JLabel();
    JLabel jLabel4 = new JLabel();
    String[] ziti = {
        "宋体", "微软雅黑", "黑体", "隶书"};
    JComboBox Zt = new JComboBox(ziti);
    String[] daxiao = {
        "8", "10", "12", "14", "16"};
    JLabel jLabel5 = new JLabel();
    JLabel jLabel7 = new JLabel();
    String[] yanse = {
        "黑色", "红色", "黄色", "蓝色"};
    JComboBox Ys = new JComboBox(yanse);
    JLabel jLabel6 = new JLabel();
    String[] s = {
        "默认", "白色", "蓝色", "天蓝"};
    JComboBox Pf = new JComboBox(s);
    JButton jButton3 = new JButton();
    JLabel jLabel8 = new JLabel();

    public ClientFrame(Socket socket, DataInputStream dis,
                       DataOutputStream dos, String name) {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
            //定义连接套接字
            this.socket = socket;
            this.dis = dis;
            //用来实现客户端接受服务器的数据的输入流
            this.dos = dos;
            this.listen = new Listen(name);
            listen.start();
            send("PEOPLE?");
            //设置左上小图标
            this.setIconImage(Toolkit.getDefaultToolkit().createImage(
                "images/friends.png"));
            jbInit();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    //Component initialization
    private void jbInit() throws Exception {
        contentPane = (JPanel)this.getContentPane();
        contentPane.setLayout(borderLayout4);
        this.setSize(new Dimension(629, 487));
        this.setTitle("网络聊天客户端");
        jButton1.setFont(new java.awt.Font("Serif", 0, 14));
        jButton1.setBorder(null);
        jButton1.setIcon(new ImageIcon("images/send.jpg"));
        jButton1.addActionListener(new ClientFrame_jButton1_actionAdapter(this));
        //发送消息快捷键设置
        jButton1.setMnemonic(KeyEvent.VK_ENTER);
        jButton2.setFont(new java.awt.Font("Serif", 0, 14));
        jButton2.setBorder(null);
        jButton2.setDisabledIcon(null);
        jButton2.setIcon(new ImageIcon("images/exit.jpg"));
        jButton2.addActionListener(new ClientFrame_jButton2_actionAdapter(this));
        jLabel2.setText("方式");
        jRadioButton1.setSelected(false);
        jRadioButton1.setText("广播");
        jRadioButton2.setSelected(true);
        jRadioButton2.setText("选择");
        chat2.setFont(new java.awt.Font("Serif", 0, 12));
        chat2.setBorder(BorderFactory.createEtchedBorder());
        chat2.setText("");
        chat2.setCaretPosition(chat2.getDocument().getLength());
        jTextField2.setFont(new java.awt.Font("Serif", 0, 12));
        jTextField2.setEditable(false);
        jTextField2.setText("");
        list1.setFont(new java.awt.Font("Serif", 0, 12));
        list1.addMouseListener(new ClientFrame_list1_mouseAdapter(this));
        list1.addActionListener(new ClientFrame_list1_actionAdapter(this));
        jPanel3.setLayout(paneLayout1);
        jPanel5.setLayout(borderLayout1);
        jPanel4.setLayout(paneLayout2);
        jPanel7.setLayout(paneLayout3);
        jPanel9.setLayout(borderLayout2);
        jPanel11.setLayout(borderLayout3);
        chat1.setBorder(BorderFactory.createEtchedBorder());
        chat1.setLineWrap(true);
        jPanel8.setLayout(null);
        jPanel10.setLayout(flowLayout2);
        flowLayout2.setAlignment(FlowLayout.LEFT);
        jPanel2.setLayout(flowLayout3);
        flowLayout3.setAlignment(FlowLayout.RIGHT);
        paneLayout2.setGap(5);
        paneLayout1.setGap(5);
        jPanel9.setBorder(BorderFactory.createEtchedBorder());
        jPanel10.setBorder(BorderFactory.createEtchedBorder());
        jPanel11.setBorder(BorderFactory.createEtchedBorder());
        jLabel1.setText("在线列表:");
        jPanel6.setLayout(flowLayout4);
        flowLayout4.setAlignment(FlowLayout.LEFT);
        jLabel3.addAncestorListener(new ClientFrame_jLabel3_ancestorAdapter(this));
        jLabel4.setHorizontalAlignment(SwingConstants.RIGHT);
        jLabel4.setText("0");
        jLabel4.setBounds(new Rectangle(336, 5, 138, 15));
        Zt.setBorder(BorderFactory.createEtchedBorder());
        Zt.addActionListener(new ClientFrame_Zt_actionAdapter(this));
        jLabel5.setText("字体:");
        jLabel7.setText("颜色:");
        Ys.addActionListener(new ClientFrame_Ys_actionAdapter(this));
        jLabel6.setText("皮肤:");
        Pf.addActionListener(new ClientFrame_Pf_actionAdapter(this));
        jButton3.setBorder(null);
        jButton3.setIcon(new ImageIcon("images/jiluopen.jpg"));
        jButton3.addActionListener(new ClientFrame_jButton3_actionAdapter(this));
        jLabel8.setIcon(new ImageIcon("images/ma.gif"));
        jLabel8.setBounds(new Rectangle(23, 0, 279, 27));
        jScrollPane2.setBorder(null);
        jScrollPane3.setBorder(BorderFactory.createEtchedBorder());
        jScrollPane1.setBorder(null);
        buttonGroup1.add(jRadioButton2);
        buttonGroup1.add(jRadioButton1);
        jPanel5.add(jScrollPane3, java.awt.BorderLayout.CENTER);
        jPanel9.add(jScrollPane1, java.awt.BorderLayout.CENTER);
        jPanel11.add(jScrollPane2, java.awt.BorderLayout.CENTER);
        jPanel10.add(jLabel2);
        jPanel10.add(jRadioButton1);
        jPanel10.add(jRadioButton2);
        jPanel10.add(jLabel5);
        jPanel10.add(Zt);
        jPanel10.add(jLabel7);
        jPanel10.add(Ys);
        jPanel10.add(jLabel6);
        jPanel10.add(Pf);
        jScrollPane2.getViewport().add(chat1);
        jScrollPane1.getViewport().add(chat2);
        jScrollPane3.getViewport().add(list1);
        jPanel11.add(jPanel2, java.awt.BorderLayout.SOUTH);
        jPanel2.add(jButton3);
        jPanel2.add(jButton2);
        jPanel2.add(jButton1);
        jPanel5.add(jTextField2, java.awt.BorderLayout.SOUTH);
        jPanel5.add(jLabel1, java.awt.BorderLayout.NORTH);
        contentPane.add(jPanel3, java.awt.BorderLayout.CENTER);
        jPanel3.add(jPanel4,
                    new PaneConstraints("jPanel4", "jPanel4",
                                        PaneConstraints.ROOT, 0.5F));
        jPanel3.add(jPanel5,
                    new PaneConstraints("jPanel5", "jPanel4",
                                        PaneConstraints.RIGHT, 0.22575516F));
        jPanel6.add(jLabel3);
        jPanel4.add(jPanel6,
                    new PaneConstraints("jPanel6", "jPanel6",
                                        PaneConstraints.ROOT, 0.5F));
        jPanel4.add(jPanel7,
                    new PaneConstraints("jPanel7", "jPanel6",
                                        PaneConstraints.BOTTOM, 0.9527721F));
        jPanel4.add(jPanel8,
                    new PaneConstraints("jPanel8", "jPanel7",
                                        PaneConstraints.BOTTOM, 0.06373626F));
        jPanel8.add(jLabel4);
        jPanel8.add(jLabel8);
        jPanel7.add(jPanel9,
                    new PaneConstraints("jPanel9", "jPanel9",
                                        PaneConstraints.ROOT, 0.5F));
        jPanel7.add(jPanel10,
                    new PaneConstraints("jPanel10", "jPanel9",
                                        PaneConstraints.BOTTOM, 0.39423078F));
        jPanel7.add(jPanel11,
                    new PaneConstraints("jPanel11", "jPanel10",
                                        PaneConstraints.BOTTOM, 0.75609756F));
    }

    //Overridden so we can exit when window is closed
    protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            disconnect();
            System.exit(0);
        }
    }

    //disconnect方法用于断开连接
    public void disconnect() {
        if (socket != null) {
            try {
                send("QUIT:" + name);
                socket.close();
            }
            catch (IOException e) {
                chat2.append("Error:" + e);
            }
            finally {
                listen.stop();
                socket = null;
                name = null;
            }
        }
    }

    //send方法用于向服务器发送消息
    private void send(String msg) {
        try {
            dos.writeUTF(msg);
            dos.flush();
        }
        catch (IOException ex) {
            chat2.append("发送消息时出错了!\n Error:"
                         + ex);
        }
    }

    class playsound
        extends Thread {
        public void run() {

        }
    }

    //定义客户端线程用来监听服务器传来的信息
    public class Listen extends Thread {
        //Listen 类的构造方法
        //设定当前客户的名字
        public Listen(String n) {
            name = n;
        } //结束Listen类的构造方法

        //Listen类的run方法不断接收和处理服务器发送来的消息
        public void run() {
            String message = null;
            while (true) {
                //无限循环用于监听信息
                try {
                    message = dis.readUTF();
                    //读取服务器传来的信息
                    //为了能处理中文这里与书上不同,不然遇到中文会是乱码
                }
                catch (IOException e) {
                    chat2.append("读取服务器信息错误!" +
                                 "\nError:  " + e + "\n");
                    disconnect();
                    stop();
                }
                if (message == null) {
                    //如果服务器传来的信息为空,则断开此次连接
                    listen = null;
                    socket = null;
                    list1.removeAll();
                    return;
                }
                StringTokenizer str =
                    new StringTokenizer(message, ":");
                //用StringTokenizer类来实现读取分段字符
                String keyword = str.nextToken();
                //读取信息头来识别试何种信息
                if (keyword.equalsIgnoreCase("PEOPLE")) {
                    //如果读取的是PEOPLE,
                    //则表示是服务器发送的客户连接信息,
                    //此时,需要刷新客户端的用户列表
                    count = 0;
                    list1.removeAll();
                    while (str.hasMoreTokens()) {
                        String st = str.nextToken();
                        //读取加入的用户名称
                        list1.add(st);
                        //添加到用户列表中
                        count++; //统计用户数目
                    }
                    try {
                        InputStream in = new FileInputStream("online.au");
                        AudioStream as = new AudioStream(in);
                        AudioPlayer.player.start(as);
                    }
                    catch (FileNotFoundException ex1) {
                    }
                    catch (IOException ex1) {
                    }

                    jTextField2.setText("在线数: " +
                                        String.valueOf(count));
                }
                else if (keyword.equalsIgnoreCase("MSG")) {
                    //如果读取的是MSG,则表示是服务器发送的是
                    //客户传来的聊天信息,接受的信息类型,是单播还是广播。
                    String broadcast = str.nextToken();
                    //取下一个分段字符串。
                    String usr = str.nextToken();
                    //取信息发送的来源,即是谁发布的消息
                    chat2.append(usr);
                    //在jTextArea1里输出用户名
                    chat2.append(str.nextToken("\0"));
                    //在jTextArea1里输出消息的内容
                    chat2.append("\n");
                    //换行
                    if (usr.equals(name)) {
                        /////////////////////////////////////////////////////////////
                        ////////////////如果是自己发送的消息在这里则不处理/////////////////
                        //////////////////////////////////////////////////////////////
                    }
                    else {
                        jLabel4.setText(usr + " 给你发来新消息");
                        //-------播放声音,仅播放一次
                        try {
                            InputStream in = new FileInputStream("msg.au");
                            AudioStream as = new AudioStream(in);
                            AudioPlayer.player.start(as); //播放
                            //AudioPlayer.player.stop(as);

                        }
                        catch (FileNotFoundException ex) {
                        }
                        catch (IOException ex) {
                        }

                    }
                }
                else if (keyword.equalsIgnoreCase("QUIT")) {
                    //如果关键字是QUIT,则判断是服务器的关闭信息,
                    //用户需要用此信息来切断此次连接
                    String who = str.nextToken();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -