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

📄 chatframe.java~1~

📁 一个用JAVA做的可以网络和单机聊天的程序
💻 JAVA~1~
字号:
package chatclient;
/**
 *AUTHOR:David Chow
 *Description:The Chat Client
 *Date:2007-12-28 Finished
 *
 * 作者:周蔚
 * 描述:聊天室客户端
 * 日期:2007年12月28日
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;
import java.net.*;
import java.io.*;

public class ChatFrame extends JFrame {
    private Socket s;
    private String clientName;
    private PrintWriter out;
    JScrollPane srpList = new JScrollPane();
    JList lstUsers = new JList();
    JScrollPane srpChat = new JScrollPane();
    JList lstChat = new JList();
    JTextField txtMessage = new JTextField();
    JComboBox cmbType = new JComboBox();
    JButton btnSend = new JButton();


    public ChatFrame(Socket s, String clientName) {
        try {
            this.s = s;
            this.clientName = clientName;
            this.setTitle("欢迎" + clientName + "来到本聊天室");
            jbInit();
        } catch (Exception exception) {

        }
    }

    private void jbInit() throws Exception {
        lstChat.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        lstChat.setModel(new DefaultListModel());
        lstUsers.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        lstUsers.setModel(new DefaultListModel());
        getContentPane().setLayout(null);
        Border border = BorderFactory.createEtchedBorder(Color.white,
                new Color(170, 170, 170));
        srpList.setBorder(new TitledBorder(border, "用户列表",
                                           TitledBorder.ABOVE_TOP,
                                           TitledBorder.CENTER,
                                           new Font("Dialog", Font.PLAIN, 12)));
        srpList.setBounds(new Rectangle(18, 14, 104, 314));
        srpChat.setBounds(new Rectangle(137, 16, 327, 309));
        srpChat.setBorder(new TitledBorder(border, "聊天记录",
                                           TitledBorder.ABOVE_TOP,
                                           TitledBorder.CENTER,
                                           new Font("Dialog", Font.PLAIN, 12)));
        cmbType.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        cmbType.setBounds(new Rectangle(344, 333, 115, 28));
        Vector vc = new Vector();
        btnSend.setBounds(new Rectangle(344, 372, 114, 28));
        btnSend.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        btnSend.setText("发送");
        btnSend.addActionListener(new ChatFrame_btnSend_actionAdapter(this));
        txtMessage.setFont(new java.awt.Font("Dialog", Font.PLAIN, 12));
        vc.add("群聊");
        vc.add("私聊");
        cmbType.setBorder(new LineBorder(Color.GRAY));
        cmbType.setModel(new DefaultComboBoxModel(vc));
        this.getContentPane().add(srpList);
        txtMessage.setText("");
        txtMessage.setBounds(new Rectangle(22, 333, 305, 28));
        this.getContentPane().add(txtMessage);
        this.getContentPane().add(srpChat);
        this.getContentPane().add(cmbType);
        this.getContentPane().add(btnSend);
        srpChat.getViewport().add(lstChat);
        srpList.getViewport().add(lstUsers);
        lstUsers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        new ChatThread(s).start();

    }

//发送消息
    public void btnSend_actionPerformed(ActionEvent e) {
        String text = txtMessage.getText().trim();
        txtMessage.setText("");
        if (text.equals("")) {
            JOptionPane.showMessageDialog(null, "信息不能为空!");
        } else {
            //获得发送消息的类型
            int index = cmbType.getSelectedIndex();
            if (index == 0) {
                out.println(clientName + ":all:" + text);
            } else {
                int item = lstUsers.getSelectedIndex();
                if (item == -1) {
                    JOptionPane.showMessageDialog(null, "私聊必须选择一个用户");
                } else {
                    String name=lstUsers.getSelectedValue().toString();
                    if(name.equals(clientName))
                    {
                        JOptionPane.showMessageDialog(null,"您不能和您自己私聊");
                    }else
                    {
                        ((DefaultListModel)lstChat.getModel()).addElement(clientName+"对"+name+"说:"+text);
                        out.println(clientName + ":" + item + ":" + text);
                    }
                }
            }
        }
    }


//会话线程
    class ChatThread extends Thread {
        private Socket s;
        public ChatThread(Socket s) {
            this.s = s;
        }

        public void run() {
            try {
                out = new PrintWriter(s.getOutputStream(), true);
                BufferedReader br = new BufferedReader(new InputStreamReader(s.
                        getInputStream()));
                new GetThread(br).start();
                out.println(clientName);
            } catch (Exception ex) {
            }
        }
    }


//获取信息线程
    class GetThread extends Thread {
        private BufferedReader br;
        public GetThread(BufferedReader br) {
            this.br = br;
        }

        public void run() {
            try {
                while (true) {
                    String msg = br.readLine();
                    //判断是否服务器已经关闭,或者已经被服务器T出来
                    if (msg == null) {
                        break;
                    }
                    //判断服务器发送过来的内容是什么类型?
                    if(msg.startsWith("list:"))
                    {
                        DefaultListModel  dlm=new DefaultListModel();;
                        String list=msg.substring(5);
                        StringTokenizer st=new StringTokenizer(list,"[,]");
                        while(st.hasMoreTokens())
                        {
                           dlm.addElement(st.nextToken().trim());
                        }
                        lstUsers.setModel(dlm);
                    }else
                    {
                        ((DefaultListModel) lstChat.getModel()).addElement(msg);
                    }
                }
            } catch (Exception ex) {
            } finally {
                JOptionPane.showMessageDialog(null, "<html>与主机失去联系!发生错误的原因可能有:<br>①您的昵称已经存在,请更改<br>②服务器已经关闭,请等待服务器重新启动<br>③您被管理员踢出来了!请注意遵守聊天室规则</html>");
                new Start();
                ChatFrame.this.dispose();
            }
        }
    }

}


class ChatFrame_btnSend_actionAdapter implements ActionListener {
    private ChatFrame adaptee;
    ChatFrame_btnSend_actionAdapter(ChatFrame adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.btnSend_actionPerformed(e);
    }
}

⌨️ 快捷键说明

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