📄 chatclient.java
字号:
/**
* Socket 网络聊天室
* 客户端聊天界面
*
*@author 董利伟
*@version 1.0 2006/07/26
*/
package dongliwei.chat.client;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
/**
*聊天室的主窗体实现了Runnable接口,该线程的Run方法用于
*不断的接受服务器所发送的信息
*/
public class ChatClient extends JFrame implements Runnable
{
JPanel jp1;//窗体上默认的容器
JFrame jf;//窗体的引用
int frame_W;//窗体的宽度
int frame_H;//窗体的高度
/**
*聊天室的菜单项目
*/
JMenuBar jmb;
JMenu menuFile;
JMenu menuEdit;
JMenu menuPastime;
JMenu menuRule;
JMenu menuHelp;
JMenuItem menuGame1;
JMenuItem menuGame2;
JMenuItem menuGame3;
JMenuItem menuGame4;
JMenuItem menuGame5;
JMenuItem menuGame6;
JMenuItem menuGame7;
JPanel userListContainer;//记录在线用户的昵称等相关内容的容器
JEditorPane userList;//用户列表
JScrollPane sp;
JPanel userOperateContainer;//容纳用户进行聊天工具的按钮
JComboBox expression;//存放用户表情的下拉列表
JLabel txt1 = new JLabel(" 对 ");
JComboBox users;//存放用户的下拉列表
JLabel txt2 = new JLabel(" 说 ");
JEditorPane speak;//用户进行对话的面板
String speaks = "";
JScrollPane sp1;
JButton btOk = new JButton("发送");//发送用户的聊天内容
JEditorPane chatAnnal;//用户之间的聊天信息
JScrollPane sp2;
ClientOperationDispose cod;//业务逻辑处理类
Thread thread ;
Font f = new Font("宋体",0,15);//为了同一的初始化窗体的字体
String str_user_name;//用于存储当前登录的用户昵称
String str_user_fullname;//用于存储用户的全部信息
boolean closeframe = false;
String talks = "";
String osfont = " face = '宋体' ";
String ossize = " size = 4 ";
String oscolor = " color = red ";
String brr = "<br>";
String clientfont = " face = '宋体' ";
String clientsize = " size = 4 ";
String clientcolor = " color = blue ";
String list = "";
FaceDialog fd;//表情对话框
RuleDialog rd;//声明对话框
AttributeBar ab;//设置字体对话框
Color frameColor;
public ChatClient()
{
jf = this;
jp1 = (JPanel)this.getContentPane();
jp1.setLayout(null);
frameColor = this.getBackground();
Toolkit tk = this.getToolkit();
Dimension dms = tk.getScreenSize();
this.frame_W = (int)(dms.getWidth());
this.frame_H = (int)(dms.getHeight());
this.setBounds(0,0,frame_W,frame_H);
jmb = new JMenuBar();
menuFile = new JMenu("文件");
menuEdit = new JMenu("字体");
menuPastime = new JMenu("娱乐");
menuRule = new JMenu("关于");
menuHelp = new JMenu("帮助");
menuGame1 = new JMenuItem("当空接龙");
menuGame2 = new JMenuItem("扫雷游戏");
menuGame3 = new JMenuItem("纸牌游戏");
//menuGame4 = new JMenuItem("桌上弹球");
menuGame5 = new JMenuItem("播放器");
menuGame6 = new JMenuItem("音量控制");
menuGame7 = new JMenuItem("屏幕键盘");
menuPastime.add(menuGame1);
menuPastime.add(menuGame2);
menuPastime.add(menuGame3);
// menuPastime.add(menuGame4);
menuPastime.addSeparator();
menuPastime.add(menuGame5);
menuPastime.add(menuGame6);
menuPastime.add(menuGame7);
menuGame1.addMouseListener(new MenuEventBar());
menuGame2.addMouseListener(new MenuEventBar());
menuGame3.addMouseListener(new MenuEventBar());
// menuGame4.addMouseListener(new MenuEventBar());
menuGame5.addMouseListener(new MenuEventBar());
menuGame6.addMouseListener(new MenuEventBar());
menuGame7.addMouseListener(new MenuEventBar());
jmb.add(menuFile);
jmb.add(menuEdit);
jmb.add(menuPastime);
jmb.add(menuRule);
jmb.add(menuHelp);
this.setJMenuBar(jmb);
menuRule.addMouseListener(new MenuEventBar());
menuEdit.addMouseListener(new MenuEventBar());
menuHelp.addMouseListener(new MenuEventBar());
/**
*显示当前用户的标签
*/
JLabel infouser = new JLabel(" 当前在线用户");
infouser.setFont(new Font("宋体",Font.BOLD,17));
infouser.setBounds(frame_W-210,0,200,25);
jp1.add(infouser);
str_user_name = ClientInfo.userName;//保存用户的昵称
str_user_fullname = ClientInfo.imageURL + ClientInfo.userName;
userList = new JEditorPane("text/html",list);
sp = new JScrollPane(userList);
sp.setSize(200,530);
userList.setEditable(false);
sp.setLocation(frame_W-210,30);
jp1.add(sp);
userOperateContainer = new JPanel();//容纳用户进行聊天工具的按钮
userOperateContainer.setLayout(null);
expression = new JComboBox();
expression.setBounds(80,10,100,25);
userOperateContainer.add(expression);
expression.addItem("微笑着");
expression.addItem("高兴的");
expression.addItem("哭着");
expression.addItem("害羞的");
expression.addItem("生气的");
expression.addItem("伤心的");
expression.addItem("无奈的");
expression.addItem("大笑着");
txt1.setBounds(190,10,50,25);
userOperateContainer.add(txt1);
/**
*用户姓名的下拉列表
*/
users = new JComboBox();
users.setBounds(245,10,100,25);
userOperateContainer.add(users);
/**
*用户进行对话的对话框
*/
speak = new JEditorPane("text/html",speaks);
speak.addKeyListener(new BtEnter());
speak.setFont(f);
sp1 = new JScrollPane(speak);
sp1.setBounds(80,40,430,90);
userOperateContainer.add(sp1);
JButton btface = new JButton("特殊表情");
btface.setBounds(410,10,100,25);
btface.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(fd == null)
{
fd = new FaceDialog();
}
}
});
userOperateContainer.add(btface);
btOk = new JButton(" 发送 ");
btOk.addActionListener(new BtActionEvent());
btOk.setBounds(550,100,100,25);
userOperateContainer.add(btOk);
txt2.setBounds(350,10,100,25);
userOperateContainer.add(txt2);
userOperateContainer.setSize(frame_W-210,200);
userOperateContainer.setLocation(0,frame_H-210);
jp1.add(userOperateContainer);
/**
*显示用户之间的对话信息
*/
chatAnnal = new JEditorPane("text/html",talks);
chatAnnal.setEditable(false);
sp2 = new JScrollPane(chatAnnal);
sp2.setBounds(0,0,frame_W-210,frame_H-210);
jp1.add(sp2);
Calendar cdt = Calendar.getInstance();
int yy = cdt.get(Calendar.YEAR);
int mm = cdt.get(Calendar.MONTH) + 1;
int dd = cdt.get(Calendar.DATE);
String s = " ★★★★★★【今天是 " + yy + " 年 " + mm + " 月 " + dd + " 日】★★★★★★";
talks = talks + brr + "<font " + oscolor + ossize + osfont + ">" + s + "</font>" + brr;
chatAnnal.setText(talks);
try
{
cod = new ClientOperationDispose();
}
catch (Exception ex)
{
System.out.println("连接失败");
ex.printStackTrace();
}
cod.loginClient();
thread = new Thread(this);
thread.start();
String todays = "";
JEditorPane today = new JEditorPane("text/html",todays);
today.setText("<br><br>    当前用户:" + ClientInfo.imageURL + ClientInfo.userName + "<br>"
+"<font color = red >"+"   今天是" + yy + "年" + mm + "月" + dd + "日 </font>" );
today.setBackground(frameColor);
today.setEditable(false);
today.setSize(200,200);
today.setLocation(frame_W-210,frame_H-210);
jp1.add(today);
this.setTitle("欢迎进入聊天室");
this.setResizable(false);
this.addWindowListener(new CloseFrame());
this.setVisible(true);
}
/**
*
*聊天室客户端业务处理模块
* (内部类)
*
*/
class ClientOperationDispose
{
Socket client;
InputStream inputstream;
BufferedReader br;
OutputStream outputstream;
PrintWriter pw;
String str = "";
public ClientOperationDispose()throws Exception
{
String ip = ClientInfo.serverIP;
int part = ClientInfo.serverPart;
client = new Socket(ip,part);
inputstream = client.getInputStream();
br = new BufferedReader(new InputStreamReader(inputstream));
outputstream = client.getOutputStream();
pw = new PrintWriter(new OutputStreamWriter(outputstream));
}
/**
*刚登上服务器时向服务器发送 "$newuser昵称";
*/
public void loginClient()
{
try
{
String name = ClientInfo.userName;
String photourl = ClientInfo.imageURL;
pw.println("$newuser" + photourl + name );
pw.flush();
}
catch(Exception ex)
{
System.out.println(ex);
ex.printStackTrace();
}
}
/**
*用于客户端用户向其他用户发送信息
*/
public void speak(String str)
{
try
{
pw.print(str);
System.out.println("完成发送");
pw.flush();
}
catch(Exception ex)
{
System.out.println(ex);
ex.printStackTrace();
}
}
/**
*客户端接受服务器的信息
*/
public void readInfo()throws Exception
{
System.out.println("*********");
String strsay = "";
str = br.readLine();
System.out.println(str + "00000000000");
if(str.length() > 1 && str.startsWith("$userjion"))
{
System.out.println(str + "11111111");
strsay = str.substring(9);
String dlw1 = " ★★★★★【系统公告: 欢迎 『" + strsay + "』 上线. 】★★★★★" + "\n";
System.out.println(dlw1);
String dlw2 = "<font" + oscolor + ossize + osfont + ">" + dlw1 + "</font>" + brr;
System.out.println(dlw2);
talks = talks + dlw2;
chatAnnal.setText(talks);
chatAnnal.selectAll();
users.removeAllItems();
users.addItem(" 大家 ");
userList.setText("");
list = "";
}
else if(str.length() > 1 && str.startsWith("$newuser"))
{
System.out.println(str + "222222222");
String str_name = str.substring(8);
list = list + str_name+ "<br>" ;
userList.setText(list);
int aa1 = str.lastIndexOf("height=20>");
String sa1 = str.substring(aa1 + 10);
System.out.println ("+++++++++++++++++++++++++++++++++++++" + sa1);
if(!(str_user_name.equals(sa1)))
{
users.addItem(sa1);
}
}
else if(str.length() > 1 && str.startsWith("$quituser"))
{
strsay = str.substring(9);
String dlw1 = " ★★★★★【系统公告: 大家的好朋友 『" + strsay + "』 下线了. 】★★★★★" + "\n";
String dlw2 = "<font " + oscolor + ossize + osfont + ">" + dlw1 + "</font>" + brr;
talks += dlw2;
chatAnnal.setText(talks);
users.removeAllItems();
users.addItem(" 大家 ");
userList.setText("");
list = "";
}
else if(str != "")
{
System.out.println(str + "33333333");
String dlw = "<font " + clientcolor + clientsize + clientfont + ">" + " " + str + "\n" + "</font>" + brr;
talks += dlw;
chatAnnal.setText(talks);
chatAnnal.selectAll();
}
}
/**
*用于断开客户端的连接
*/
public void diosConn()
{
pw.println("$quituser" + str_user_fullname);
pw.flush();
System.out.println("已经发送" + "$quituser" + str_user_fullname);
System.exit(0);
}
}
/**
*窗体的 Run 方法
*/
public void run()
{
try
{
while(true)
{
cod.readInfo();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
/**
*选择表情的对话框
*/
class FaceDialog
{
JDialog jdg;
JPanel fp;
JButton[] bt;
JScrollPane sp;
public FaceDialog()
{
jdg = new JDialog(jf);
fp = new JPanel();
fp.setLayout(new GridLayout(10,10,2,2));
sp = new JScrollPane(fp);
jdg.add(sp);
bt = new JButton[96];
for (int i = 0; i < 96; i++)
{
bt[i] = new JButton(new ImageIcon("image/" + i + ".gif"));
fp.add(bt[i]);
bt[i].addActionListener(new BtFaceEvent());
}
jdg.setSize(600,250);
jdg.setTitle("请选择表情");
jdg.setLocation(0,350);
jdg.setAlwaysOnTop(true);
jdg.setFocusCycleRoot(true);
jdg.setResizable(false);
jdg.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
fd = null;
jdg.dispose();
}
});
jdg.setVisible(true);
}
class BtFaceEvent implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for (int i = 0; i < 96; i++)
{
if(e.getSource() == bt[i])
{
String s1 = speak.getText();
System.out.println (s1);
int a = s1.indexOf("<body>");
int b = s1.lastIndexOf("</body>");
String s2 = s1.substring(a+11,b);
String ss = s2 + "<img src= file:./image/" + i + ".gif width=20 height=20>";
System.out.println("dongliwei 1 2 3 4 5 6 7 8 9 0 " + ss);
speak.setText(ss);
fd = null;
jdg.dispose();
}
}
}
}
}
class CloseFrame extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
cod.diosConn();
}
}
class BtActionEvent implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == btOk)
{
if(speak.getText().trim().equals(""))
{
JOptionPane.showMessageDialog(null, "不能发送空信息", "信息提示", JOptionPane.ERROR_MESSAGE);
}
else
{
Calendar cdt = Calendar.getInstance();
String s1 = ClientInfo.userName;
String s2 = (String)expression.getSelectedItem();
String s3 = (String)users.getSelectedItem();
int hh = cdt.get(Calendar.HOUR);
int mm = cdt.get(Calendar.MINUTE);
int ss = cdt.get(Calendar.SECOND);
System.out.println("所说时间");
String str4 = "〖" + s1 + "〗 于 " + hh + ":" + mm + ":" + ss + " " + s2 + "对 〖" + s3 + "〗 说: \n";
cod.speak(str4);
String sa1 = speak.getText();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -