📄 clientframe.java~28~
字号:
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();
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();
//定义数据流和网络变量
Socket socket = null; //定义连接套接字
DataInputStream dis = null;
//用来实现客户端接受服务器的数据的输入流
DataOutputStream dos = null;
//用来实现客户端向服务器的输出流
Listen listen = null; //定义客户端线程
boolean notEnd = true;
int count = 0;
String name = null;
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连接
socket.close();
}
catch (IOException e) {
chat2.append("Error:" + e);
}
finally {
//停止监听
listen.stop();
//socket,name为null,以便再次登录
socket = null;
name = null;
}
}
}
//send方法用于向服务器发送消息
private void send(String msg) {
try {
//写入UTF字符
dos.writeUTF(msg);
//写出缓存
dos.flush();
}
catch (IOException ex) {
chat2.append("发送消息时出错了!\n Error:"
+ ex);
}
}
//定义客户端线程用来监听服务器传来的信息
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类来实现读取分段字符
StringTokenizer str =
new StringTokenizer(message, ":");
//读取信息头来识别试何种信息
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();
//在jTextArea1里输出用户名
chat2.append(usr);
//在jTextArea1里输出消息的内容
chat2.append(str.nextToken("\0"));
//换行
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);
}
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 + -