//服务端
package chatApp;
import java.net.*;
import java.io.*;
import java.util.*;
public class chatserverthree implements Runnable
{
public static final int PORT=1234;
protected ServerSocket listen;
static Vector connections;
Thread connect;
public chatserverthree()
{
try
{
listen=new ServerSocket(PORT);
}
catch(UnknownHostException e2)
{
System.err.println("erro:"+e2);
}
catch(IOException e)
{
System.err.println("erro:"+e);
System.exit(1);
}
connections=new Vector(1000);
connect=new Thread(this);
connect.start();
}
public static void main(String args[])
{
new chatserverthree();
System.out.println("Chat Server is starting!......");
}
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 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;
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("QUIT"))
{
server.broadcast("QUIT"+this.name);
server.connections.removeElement(this);
this.in.close();
this.out.close();
this.firstout.close();
this.client.close();
this.yield();
}
else if(line.startsWith("MSG"))
{
server.broadcast(line);
}
else if(line.startsWith("悄悄地对"))
{
this.out.writeUTF(line);
server.broadcast1(line);
}
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){}
}
}
}
catch(IOException e)
{server.connections.removeElement(this);}
catch(NullPointerException e)
{server.connections.removeElement(this);}
}
}
//客户端
package chatApp;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
class Mywindow extends Frame implements ActionListener
{
TextField text1;
TextField text2;
Button button1;
Button 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);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
setVisible(false);
System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button1)
{
try{chatappletthree.out.writeUTF("悄悄地对"+text1.getText()
+"说:"+text2.getText()+"(我是"+chatappletthree.name+")");
}
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("蘑菇",true,sex);
add(new Label("输入昵称"));
add(name_txt);
add(box1);
add(box2);
add(box3);
add(button1);
add(button2);
add(new Label(""));
}
}
class Bpanel extends Panel
{
TextArea chat_txt;
B2panel b2;
Bpanel()
{
chat_txt=new TextArea(25,75);
b2=new B2panel();
chat_txt.setVisible(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 button1,button2,button3;
Cpanel()
{
msg_txt=new TextField(44);
button1=new Button("送出");
button2=new Button("刷新谈话区");
button2=new Button("刷新聊天者列表");
setLayout(new FlowLayout());
add(new Label("您要说的话:"));
add(msg_txt);
add(button1);
add(button2);
add(button3);
}
}
public class chatappletthree extends Applet implements Runnable,
ActionListener,ItemListener
{
public static final int PORT=1234;
static String name,xingbie;
Socket socket;
int jilu,enter=0;
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("North",a);
add("Center",b);
add("South",c);
a.button1.addActionListener(this);
a.button2.addActionListener(this);
c.button1.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.white);
b.chat_txt.setBackground(new Color(200,185,220));
b.chat_txt.setFont(new Font("TimeRoman",Font.PLAIN,12));
}
public void start()
{
this.getCodeBase().getHost();
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
{
out.writeUTF("QUIT");
}
catch(IOException e){}
}
public void destroy()
{
try
{
socket.close();
}
catch(IOException e)
{
this.showStatus(e.toString());
}
if((thread!=null)&&thread.isAlive())
{
thread.yield();
thread=null;
}
}
public void run()
{
String line;
try
{
while(true)
{
line=in.readUTF();
if(line.startsWith("PEOPLE"))
{
String listString=line;
if(line.endsWith("*"))
{
listString=line.substring(0, (line.length()-1));
}
b.b2.list.add(listString.substring(6));
if(!line.endsWith("*"))
{
b.chat_txt.append(line.substring(6)+"爬上了红蜘蛛网-"+'\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("MSG"))
{
b.chat_txt.append(line.substring(3)+'\n');
}
else if(line.startsWith("悄悄地对"))
{
b.chat_txt.append(line+'\n');
}
}
}
catch(IOException e)
{
say("再见!欢迎再来红蜘蛛聊天室,如果想重新进入本聊天室,单击浏览器的刷新选项");
}
catch(NullPointerException e){}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==a.button1)
{
name=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;
name=null;
break;
}
}
}
catch(ArrayIndexOutOfBoundsException e3){}
if(jilu==0)
{
try
{
out.writeUTF("PEOPLE"+a.name_txt.getText()+"["+xingbie+"]");
enter=1;
}
catch(IOException e1){}
}
else if(jilu==1)
{
a.name_txt.setText("该名已被使用");
}
jilu=0;
}
else if(e.getSource()==a.button2)
{
try
{
out.writeUTF("QUIT");
enter=0;
}
catch(IOException e1){}
b.b2.list.removeAll();
}
else if(e.getSource()==c.button1&&enter==1)
{
if((name!=null))
{
try
{
out.writeUTF("MSG"+name+"["+xingbie+"]"+"说-"+":"+
c.msg_txt.getText());
c.msg_txt.setText(null);
}
catch(IOException e1){}
}
}
else if(e.getSource()==b.b2.list&&enter==1)
{
mywindow.setVisible(true);
mywindow.text1.setText(((List)e.getSource()).getSelectedItem());
}
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){}
}
}
public void itemStateChanged(ItemEvent e1)
{
if(e1.getItemSelectable()==a.box1)
{
xingbie=new String("男");
}
else if(e1.getItemSelectable()==a.box2)
{
xingbie=new String("女");
}
else if(e1.getItemSelectable()==a.box3)
{
xingbie=new String("蘑菇");
}
}
public void say(String msg)
{
b.chat_txt.append("*****"+msg+"*****\n");
}
}