
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.*;
class Client extends JFrame
{
PrintStream out; //输出流
BufferedReader in; //输入流
String name;
TextArea area = new TextArea();
TextArea msgA = new TextArea();
TextField frdNameT = new TextField(10);
List list =new List();
Panel p10=new Panel();
JButton sendButton = new JButton("发送");
JButton closeButton = new JButton("关闭");
JButton privateChatButton = new JButton("私聊");
JButton jb1 = new JButton("设置背景颜色");
JButton jb2 = new JButton("设置字体颜色");
JButton jb3 = new JButton("更改头像");
JButton jb4 = new JButton("添加表情");
JButton jb5 = new JButton(new ImageIcon("粗体.JPG"));
JButton jb6 = new JButton(new ImageIcon("斜体.JPG"));
Label lb1 = new Label("昵称:");
ImageIcon picture = new ImageIcon();
JLabel label = new JLabel(picture,SwingConstants.CENTER);
ImageIcon picture1 = new ImageIcon("1.JPG");
ImageIcon picture2 = new ImageIcon("2.JPG");
ImageIcon picture3 = new ImageIcon("3.JPG");
ImageIcon picture4 = new ImageIcon("4.JPG");
//ImageIcon picture5 = new ImageIcon("5.JPG");
//ImageIcon picture6 = new ImageIcon("6.JPG");
//ImageIcon picture7 = new ImageIcon("7.JPG");
ImageIcon picture8 = new ImageIcon("8.JPG");
//ImageIcon picture9 = new ImageIcon("9.JPG");
void init(){
this.pack();
/////设置几个面板////////
Panel p1=new Panel();
Panel p2=new Panel();
Panel p3=new Panel();
Panel p4=new Panel();
Panel p5=new Panel();
Panel p6=new Panel();
Panel p7=new Panel();
Panel p8=new Panel();
Panel p9=new Panel();
lb1.setBackground(Color.pink);
////////设置两个主要的文本框////////////
BorderLayout border1=new BorderLayout();
p1.setLayout(border1);
p1.add(BorderLayout.CENTER,area);
area.setEditable(false);
FlowLayout f2=new FlowLayout(FlowLayout.LEFT);
p3.setLayout(f2);
p3.add(jb1);
p3.add(jb2);
p3.add(jb3);
p3.add(jb4);
p3.add(jb5);
p3.add(jb6);
BorderLayout border2=new BorderLayout();
p5.setLayout(border2);
p5.add(BorderLayout.NORTH,p3);
p5.add(BorderLayout.CENTER,msgA);
p5.setBackground(Color.pink);
BorderLayout border3=new BorderLayout();
p7.setLayout(border3);
p7.add(BorderLayout.CENTER,p1);
p7.add(BorderLayout.SOUTH,p5);
FlowLayout fl=new FlowLayout(FlowLayout.RIGHT);
p8.setLayout(fl);
p8.add(new JLabel("friendName"));
p8.add(frdNameT);
p8.add(privateChatButton);
p8.add(sendButton);
p8.add(closeButton);
p8.setBackground(Color.pink);
BorderLayout border4=new BorderLayout();
p9.setLayout(border4);
p9.add(BorderLayout.CENTER,p7);
p9.add(BorderLayout.SOUTH,p8);
//窗口关闭
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
BorderLayout border5=new
BorderLayout();
p10.setLayout(border5);
p10.add(BorderLayout.CENTER,list);
p10.add(BorderLayout.NORTH,label);
p10.setBackground(Color.pink);
//添加背景颜色的
jb1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JColorChooser chooser4=new JColorChooser();
Color color=chooser4.showDialog(Client.this,"我的调色盘
文本域
out.println(msg);
}
}
});
closeButton.addActionListener(new ActionListener(){//"关闭"按钮
public void actionPerformed(ActionEvent e){
System.exit(100);
}
});
jb5.addActionListener(new ActionListener(){//"粗体"按钮
public void actionPerformed(ActionEvent e){
msgA.setFont(new Font("BOLD
////////////////////////////////////////
////////设置两个主要的文本框////////////
Label lb1 = new Label("灵智灵意小组制作");
lb1.setBackground(new Color(200,200,250));
Label lb2 = new Label("port");
BorderLayout border1 = new BorderLayout();
p1.setLayout(border1);
p1.add(BorderLayout.CENTER, area);
BorderLayout border2 = new BorderLayout();
p5.setLayout(border2);
p5.add(BorderLayout.NORTH, p3);
p5.add(BorderLayout.CENTER, msgA);
BorderLayout border3 = new BorderLayout();
p7.setLayout(border3);
p7.add(BorderLayout.CENTER, p1);
p7.add(BorderLayout.SOUTH, p5);
p7.setBackground(new Color(250,150,200));
JButton startButton = new JButton("启动服务");
JButton sendButton = new JButton("发送");
JButton flushButton = new JButton("刷新列表");
FlowLayout fl = new FlowLayout(FlowLayout.LEFT);
p8.setLayout(fl);
p8.add(lb2);
p8.add(portT);
p8.add(startButton);
p8.add(sendButton);
p8.add(flushButton);
p8.setBackground(new Color(250,200,200));
BorderLayout border4 = new BorderLayout();
p9.setLayout(border4);
p9.add(BorderLayout.CENTER, p7);
p9.add(BorderLayout.SOUTH, p8);
p10.setLayout(new BorderLayout());
Label lb3 = new Label("在线用户");
lb3.setBackground(new Color(200,200,250));
p10.add(lb3,BorderLayout.NORTH);
p10.add(list,BorderLayout.CENTER);
area.setEditable(false);
BorderLayout border = new BorderLayout();
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
this.setLayout(border);
this.add(BorderLayout.NORTH, lb1);
this.add(BorderLayout.CENTER, p9);
this.add(BorderLayout.EAST, p10);
this.setTitle("聊天服务器 2009");
this.setBounds(100, 100, 600, 550);
this.setVisible(true);
//"启动服务"按钮
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread t = new Start();
t.start();
}
});//启动按钮----end
//发送按钮
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String msg = msgA.getText();
if (msg != null && msg != "") {//如果消息不为空
Calendar ca = new GregorianCalendar();
int hh = ca.get(Calendar.HOUR_OF_DAY);
int mm = ca.get(Calendar.MINUTE);
int ss = ca.get(Calendar.SECOND);
String time = new String(hh + ":" + mm + ":" + ss + " ");
broadcast(time + "[系统消息]: " + msg);//那么广播这条系统消息
area.append(time + "[系统消息]: " + msg + "\
");
msgA.setText("");
}
}
});//end
//刷新按钮
flushButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (list != nu
ll) {
list.removeAll();//清空在线用户列表,以便刷新
}
Set for (Iterator Map.Entry String aClientName = me.getKey(); Socket aClient = me.getValue(); String aClientAddress = aClient.getInetAddress().getHostAddress(); list.add(aClientName + "----" + aClientAddress); }//end of for }//end of actionPerformed });//end msgA.addKeyListener(new KeyAdapter(){//键盘---按下Enter发送信息 public void keyPressed(KeyEvent e){ int value = e.getKeyCode(); if(value == KeyEvent.VK_ENTER){ String msg = msgA.getText(); Calendar ca = new GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calendar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = new String(hh + ":" + mm + ":" + ss + " "); broadcast(time + "[系统消息]: " + msg);//那么广播这条系统消息 area.append(time + "[系统消息]: " + msg + "\ "); msgA.setText(""); } } }); }//end of init() class Start extends Thread //启动服务器的线程 { public void run() { try { if(server != null && !server.isClosed()){ area.append("警告!服务器已在启动中!\ "); } else{ server = new ServerSocket(Integer.parseInt(portT.getText()));//启动服务器 area.append((new Date()).toString() +'\ '+ "[恭喜!^_^]"+"服务器启动成功!" + "\ \ "); } while(true){ client = server.accept(); Thread sgS = new SgService(client);//为每位登录的客户创建一个线程 sgS.start();//启动客户线程 } } catch (Exception e) { System.out.println("cuowu 1"); e.printStackTrace(); } }//end of run() } //end of Start //处理单个客户的线程 class SgService extends Thread//SgService---begin { private Socket client = null;//客户套接字 private BufferedReader br = null;//输入流 private PrintStream ps = null; private int counter = 0;//记录是第几次接受用户的信息 private int mark = 0;//记录用户说不文明用语的次数 private String name = null; SgService(Socket client) {//构造方法 this.client = client; } public void run() {//run()----begin try { br = new BufferedReader(new InputStreamReader(client.getInputStream())); ps = new PrintStream(client.getOutputStream()); String msg = null; while ((msg = br.readLine()) != null) {//无限循环,意味着可以和客户进行无限次交互 if(counter == 0){ name = msg; container.put(name,client); list.add(name + "----" + client.getInetAddress().getHostAddress()); Calendar ca = ne w GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calendar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = hh + ":" + mm + ":" + ss + " "; broadcast(time + name + "上线了!"); area.append(time + name + "上线了!\ \ "); counter ++; } else{ if(msg.equals("你是个笨蛋")){ mark = mark + 1; if(mark < 3){ Calendar ca = new GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calendar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = new String(hh + ":" + mm + ":" + ss + " "); singleCom(time +"[系统消息]: 警告!请注意文明用语!" ,client); //在服务器端显示这个用户说不文明语言的次数 area.append(time + "[系统消息]: " + name +"第" + mark+ "次使用了不文明用语,特此警告!"); } else{//如果客户第三次说不文明的话,系统就把他踢出聊天室 Calendar ca = new GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calendar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = new String(hh + ":" + mm + ":" + ss + " "); if(mark == 3){ singleCom(time + "[系统消息]: 由于您多次使用了不文明用语,经警告无效,现已被踢出聊天室!" ,client);//告诉他本人 } removeClient(name,client);//从系统列表中删除这个人的信息 //并向所有人广播这一消息 broadcast(time + "[系统消息]: " + name + "由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!"); area.append(time + "[系统消息]: " + name + "由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!\ "); } //broadcast("[系统消息]: " + name + "由于使用了不文明用语,已被踢出聊天室!"); //area.append("[系统消息]: " + name + "由于使用了不文明用语,已被踢出聊天室!\ "); //list.remove(name + "----" + client.getInetAddress().getHostAddress()); //container.remove(name); } else{ Calendar ca = new GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calendar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = new String(hh + ":" + mm + ":" + ss + " "); area.append(time + name+"说:"+msg + "\ \ ");//将客户发送的消息显示在服务器的窗口中 broadcast(time + name+"说:"+msg+"\ ");//同时向每个在线客户广播这则消息 } } }//end of while } catch (Exception ex) { Calendar ca = new GregorianCalendar(); int hh = ca.get(Calendar.HOUR_OF_DAY); int mm = ca.get(Calend ar.MINUTE); int ss = ca.get(Calendar.SECOND); String time = new String(hh + ":" + mm + ":" + ss + " "); area.append(time + name + "下线了!\ "); broadcast(time + name + "下线了!\ "); list.remove(name + "----" + client.getInetAddress().getHostAddress()); container.remove(name); } }//run()---end }//SgService-----end void removeClient(String name,Socket client){//踢人 list.remove(name + "----" + client.getInetAddress().getHostAddress()); container.remove(name); } //广播 void broadcast(String msg) {//broadcast()-----begin Set Iterator String message = msg; while (it.hasNext()) {//如果列表中还有客户 Map.Entry Socket tempClient = me.getValue(); singleCom(message, tempClient);//就把消息向发给这个客户 } }//broadcast()-----end //向单个客户发送消息 private void singleCom(String msg, Socket aClient) {//singleCommunication------begin try { PrintStream pw = new PrintStream(aClient.getOutputStream()); String message = msg; pw.println(msg); } catch (Exception ex) { ex.printStackTrace(); } }//singleCommunication----end public static void main(String[] args) { new Server().init(); //启动服务器窗口 System.out.println("服务器:"); } }//end of Server //登录界面: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; class Login extends JFrame implements ActionListener { TextField txtPort; TextField txtIP; TextField txtName; JButton btnLogin; JButton btnCancel; Socket toServer; BufferedReader in; PrintStream out; public Login(){ Panel p1=new Panel(); Panel p2=new Panel(); Panel p3=new Panel(); Panel p4=new Panel(); Panel p5=new Panel(); Label l1=new Label("port"); Label l2=new Label("IP"); Label l3=new Label("昵称"); txtPort=new TextField("9999 is.setResizable(false); this.setLocation(450,250); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } //实现"登录"和"取消"按钮的 public void actionPerformed(ActionEvent e){ JButton button = (JButton)e.getSource(); if(button.equals(btnCancel)){ dispose();//如果客户按了"取消"按钮,那么登录窗口就关闭 } else {//如果客户按了"登录
