import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;

class Mywindow extends Frame implements ActionListener
{TextField text1,text2;
Button button1,button2;
Mywindow()
{super("发悄悄话窗口");
setLayout(new GridLayout(3,2));
text1=new TextField(12);
text2=new TextField(8);
button1=new Button("送出悄悄话");
button2=new Button("关闭此窗口");
add(new Label("送悄悄话到:"));
add(text1);
add(new Label("输入你的悄悄话"));
add(text2);
add(button2);
add(button1);
setSize(400,190);
text1.setEditable(false);
setVisible(false);
button1.addActionListener(this);
button2.addActionListener(this);
setBackground(Color.pink);
}
public void actionPerformed(ActionEvent e)
{if(e.getSource()==button1)x
{try{chatappletthree.out.writeUTF("悄悄的对"+text1.getText()+"说:"+text2.getText()+"(我是"+chatappletthree.baocun+")");}
catch(IOException e1){}
}
else if(e.getSource()==button2)
{this.setVisible(false);}
}
}
class Apanel extends Panel
{TextField name_txt; Button button1,button2;
Checkbox box1,box2,box3;
CheckboxGroup sex;
Apanel()
{name_txt=new TextField(10);
button1=new Button("进入聊天室");
button2=new Button("退出聊天室");
setLayout(new FlowLayout());
sex=new CheckboxGroup();
box1=new Checkbox("男M",false,sex);
box2=new Checkbox("女F",false,sex);
box3=new Checkbox("蘑菇",false,sex);
add(new Label("输入昵称"));add(name_txt);
add(box1);
add(box2);
add(box3);
add(button1);
add(button2);
add(new Label("制作:风,(jin@263.net)"));

}
}
class Bpanel extends Panel

{TextArea chat_txt;
B2panel b2;
Bpanel()
{chat_txt=new TextArea(20,75);
b2=new B2panel();
chat_txt.setEditable(false);
setLayout(new FlowLayout());
add(chat_txt);
add(b2);

}
}
class B2panel extends Panel
{java.awt.List list;
B2panel()
{try{ list=new java.awt.List(25,false);}
catch(NullPointerException e){}
setLayout(new BorderLayout());
add("Center",list);
add("North",new Label("聊天者列表:"));
add("East",new Label());
add("South",new Label("双击某昵称可悄悄话"));

}
}
class Cpanel extends Panel
{TextField msg_txt;Button button,button2,button3;
Cpanel()
{msg_txt=new TextField(66);
button=new Button("送出消息");
button2=new Button("刷新谈话区");
button3=new Button("刷新聊天者列表区");
setLayout(new FlowLayout());
add(new Label("你要说的话:"));
add(msg_txt);
add(button);
add(button2);
add(button3);

}
}
public class chatappletthree extends Applet implements Runnable,ActionListener,ItemListener

{public static final int PORT=8765; static String baocun,xingbie;
Socket socket;
int jilu,enter=1;
DataInputStream in;
static DataOutputStream out;
Thread thread;
String line;
static Apanel a;
static Bpanel b;
static Cpanel c;
static Mywindow mywindow;
public void init()
{mywindow=new Mywindow();
setBackground(new Color(113,163,139));
setLayout(new BorderLayout());
a=new Apanel();
b=new Bpanel();
c=new Cpanel();
add("Norrh",a);
add("Center",b);
add("South",c);
a.button1.addActionListener(this);
a.button2.addActionListener(this);
c.button.addActionListener(this);
c.button2.addActionListener(this);
c.button3.addActionListener(this);
a.box1.addItemListener(this);
a.box2.addItemListener(this);
a.box3.addItemListener(this);
b.b2.list.addActionListener(this);
add("East",new Label());
add("West",new Label());
jilu=0;
this.setForeground(Color.black);
c.msg_txt.setBackground(Color.yellow);
b.chat_txt.setBackground(new Color(200,185,220));

}
public void start()
{try{
socket=new Socket(this.getCodeBase().getHost(),PORT);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch(IOException e)
{ this.showStatus(e.toString());
say("欢迎来这里!");
System.exit(1);
}
say("欢迎来红蜘蛛聊天室");
if(thread==null){
thread=new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
}
public void stop()
{try{
socket.close();
}
catch(IOException e){
this.showStatus(e.toString());
}
if((thread!=null)&&thread.isAlive())
{thread.yield();thread=null;
}
}

public void destroy()
{try{out.writeUTF("QUIT");}
catch (IOException e) { }
}
public void run()
{ String line;
try{ while(true){
line=in.readUTF();
if(line.startsWith("PEOPLE"))
{
b.b2.list.add(line.substring(6));
b.chat_txt.append(line.substring(6)+"爬上红蜘蛛网??"+´\n´);

}
else if(line.startsWith("MSG"))
{b.chat_txt.append(line.substring(3)+´\n´);
}
else if(line.startsWith("QUIT"))
{
String str=line.substring(10);
try{ for(int i=0,k=0;i<=120;i++)
{String s=b.b2.list.getItem(i);
if(s.equals(str))
{
k=i;b.b2.list.remove(k);
}
b.chat_txt.append(line.substring(10)+"??高兴的离开了红蜘蛛网"+´\n´);

}

}
catch(ArrayIndexOutOfBoundsException e){ }

}
else if(line.startsWith("悄悄的对"))
{String ti=null;
ti=line.substring(line.indexOf(´:´));
if(ti.startsWith(":zhangpgxygsrok")&&(!(ti.endsWith("*"))))
{this.out.writeUTF("BADQUIT");
b.chat_txt.append("@@@@请注意!!!!:"+baocun+"["+xingbie+"]"+","+"你被踢出红蜘蛛网,注意言行哦!@@@@"+´\n´);
}
else
{b.chat_txt.append(line+´\n´);
}

}
}
} catch(IOException e)
{say("再见!欢迎再来红蜘蛛聊天室,如果想重新进入本聊天室,单击浏览器的刷新选项");}
catch(NullPointerException e) { }
}
public void actionPerformed(ActionEvent e)
{if(e.getSource()==c.button)

{if((baocun!=null))
{String ti=c.msg_txt.getText();
if(ti.equals("zhangpgxygsrok"))
{try{out.writeUTF("坏悄悄的对:"+c.msg_txt.getText());
}
catch(IOException e1) { }
}
else
{ try{out.writeUTF("MSG"+baocun+"["+xingbie+"]"+"说(Speaking)??"+":"+c.msg_txt.getText());
c.msg_txt.setText(null);}
catch (IOException e1){ }
}
}
}
else if(e.getSource()==c.button2)
{b.chat_txt.setText(null);
}
else if(e.getSource()==c.button3)
{try{b.b2.list.removeAll();
out.writeUTF("newlist");}
catch(IOException e1){}
}
else if(e.getSource()==a.button1)
{{baocun=new String(a.name_txt.getText());}
try{
for(int i=0;i<=120;i++){
if((a.name_txt.getText()!=null)&&((a.name_txt.getText()+"["+xingbie+"]").equals(b.b2.list.getItem(i))||a.name_txt.getText().equals("该名已被使用")))
{jilu=1;baocun=null;break;}

}
}
catch(ArrayIndexOutOfBoundsException e3){}
if(jilu==0)
{try{out.writeUTF("PEOPLE"+a.name_txt.getText()+"["+xingbie+"]");
}
catch(IOException e1) {}
}
else if(jilu==1)
{a.name_txt.setText("该名已被使用");
}
jilu=0;
}
else if(e.getSource()==a.button2)
{try{out.writeUTF("QUIT");
}
catch(IOException e1){}
b.b2.list.removeAll();
}
else if(e.getSource()==b.b2.list)
{mywindow.setVisible(true);
mywindow.text1.setText(((List)e.getSource()).getSelectedItem());
}

}
public void itemStateChanged(ItemEvent e1)
{if(e1.getItemSelectable()==a.box1)
{xingbie="男";}
else if(e1.getItemSelectable()==a.box2)
{xingbie=new String("女");}
else if(e1.getItemSelectable()==a.box3)
{xingbie=new String("蘑菇");}
else if((a.box1.getState()==true)&&((a.box2.getState()==true)&&(a.box3.getState()==true)))
{xingbie="单细胞";}
}
public void say(String msg)
{b.chat_txt.append("☆☆☆☆☆"+msg+"☆☆☆☆☆\n");
}
}

服务器端程序:
import java.net.*;
import java.io.*;
import java.util.*;

public class chatserverthree implements Runnable

{public static final int PORT=8765;
protected ServerSocket listen;
static Vector connections;
Thread connect;
public chatserverthree()
{try{
listen=new ServerSocket(PORT);

}
catch(IOException e){
System.err.println("erro:"+e);System.exit(1);

}
connections=new Vector(1000);connect=new Thread(this);
connect.start();

}
public void run()
{
try
{
while(true)
{Socket client=listen.accept();
firstthread f=new firstthread(this,client);
f.setPriority(Thread.MIN_PRIORITY);f.start();
connections.addElement(f);

}
}

catch (IOException e)
{System.err.println("Erro:"+e);
System.exit(1);
}
}
public static void main(String[] args)
{new chatserverthree();}
public void broadcast(String msg)
{int i; firstthread you;
for(i=0;i<connections.size();i++)
{you=(firstthread)connections.elementAt(i);
try
{you.out.writeUTF(msg);

}
catch (IOException e)
{
}


}
}
public void broadcast1(String msg)
{int i; String s1,s2,s3;
firstthread you;
s1=new String("PEOPLE");
s2=new String(msg.substring(4));
s3=s1.concat(s2);
for (i=0;i<connections.size() ;i++ )
{you=(firstthread) connections.elementAt(i);
if (s3.startsWith(you.name))
{try
{
you.out.writeUTF(msg);
}
catch (IOException e)
{
}
}
}
}
}
class firstthread extends Thread
{protected Socket client;
String line,name;
int k=0;
protected DataOutputStream firstout,out;
protected chatserverthree server;
protected DataInputStream in;
public firstthread(chatserverthree server,Socket client)
{this.server=server;this.client=client;
try
{
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
firstout=new DataOutputStream(client.getOutputStream());
}
catch (IOException e)
{try
{
server.connections.removeElement(this);
client.close();
}
catch (IOException e2)
{System.err.println("有问题哦:"+e);
return ;
}
if (this.client==null)
{server.broadcast("QUIT"+this.name);this.name=null;
}
}
}
public void run()
{
try
{
for (int i=0;i<server.connections.size() ;i++ )
{firstthread c=(firstthread)(server.connections.elementAt(i));
if (c.name!=null)
{try
{
firstout.writeUTF(c.name);
}
catch (IOException e)
{
}
}
}
}
catch (ArrayIndexOutOfBoundsException e)
{
}
catch(NullPointerException e)
{}
try
{
while (true)
{line=in.readUTF();
if (line.startsWith("PEOPLE"))
{try
{
firstthread d=(firstthread)(server.connections.elementAt(server.connections.indexOf(this)));
if (d.name!=null)
{d.name=line;
}
else if (d.name!=null)
{server.broadcast("QUIT"+this.name);
d.name=line;
}
}
catch (ArrayIndexOutOfBoundsException e)
{
}
catch (NullPointerException e) {}
finally {server.broadcast(line);}
}
else if (line.startsWith("MSG"))
{server.broadcast(line);
}
else if (line.startsWith("QUIT"))
{server.broadcast("QUIT"+this.name);
server.connections.removeElement(this);
this.client.close();this.yield();

}
else if (line.startsWith("BADQUIT"))
{server.broadcast("MSG"+(this.name).substring(6)+"被踢出去了");
server.broadcast("QUIT"+this.name);
server.connections.removeElement(this);
this.client.close();this.yield();
}
else if (line.startsWith("newlist"))
{try
{
for (int i=0;i<server.connections.size() ;i++ )
{firstthread c=(firstthread)(server.connections.elementAt(i));
if (c.name!=null)
{try
{
firstout.writeUTF(c.name);
}
catch (IOException e)
{
}
}
}
}
catch (ArrayIndexOutOfBoundsException e)
{
}
catch(NullPointerException e) { }
}
else if (line.startsWith("悄悄的对"))
{this.out.writeUTF(line+"*");
server.broadcast(line);
}
else if (line.startsWith("坏悄悄的对"))
{this.out.writeUTF(line.substring(1)+"*");
server.broadcast(line.substring(1));
}
}
}
catch (IOException e)
{server.connections.removeElement(this);
}
catch(NullPointerException e) { server.connections.removeElement(this);}
}
}