Sever.javaimport java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Server
{
public static void main(String args[])
{MainThread mThread=new MainThread();
SendThread sThread=new SendThread();
mThread.start();
sThread.start();
}
}
class MainThread extends Thread
{ int i=0;
static InetAddress cliAddress[]=new InetAddress[10];
String message;
public void run()
{byte data[]=new byte[8192];
DatagramSocket mail_data=null;
DatagramPacket pack=null;
try
{
mail_data=new DatagramSocket(9998);
pack =new DatagramPacket(data,data.length);
}
catch(Exception e){}
while(true)
{
try
{
mail_data.receive(pack);
int length=pack.getLength();
if(i==0||pack.getAddress()!=cliAddress[i-1])
{
cliAddress[i]=pack.getAddress();
i++;
}
message=pack.getAddress().toString();
message+=new String(pack.getData(),0,length);
for(int i=0;i<cliAddress.length;i++)
{
DatagramPacket send_pack=new DatagramPacket(message.getBytes(),message.getBytes().length,cliAddress[i],9999);
DatagramSocket send_data=new DatagramSocket();
send_data.send(send_pack);
}
}
catch(Exception e){}
}
}}
class SendThread extends Thread
{public void run()
{
byte data[]=new byte[8192];
String message;
DatagramSocket mail_data=null;
DatagramPacket pack=null;
try
{
mail_data=new DatagramSocket(9999);
pack =new DatagramPacket(data,data.length);
}
catch(Exception e){}
while(true)
{
try
{
mail_data.receive(pack);
int length=pack.getLength();
message=new String(pack.getData(),0,length);
for(int i=0;i<MainThread.cliAddress.length;i++)
{
DatagramPacket send_pack=new DatagramPacket(message.getBytes(),message.getBytes().length,MainThread.cliAddress[i],9999);
DatagramSocket send_data=new DatagramSocket();
send_data.send(send_pack);
}
}
catch(Exception e){}
}
}
}ChatPro.java
import javax.swing.*;
//import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class ChatPro
{
public static void main(String args[])
{
FriendsWnd wnd=new FriendsWnd();
wnd.validate();
}
}class Friend implements ActionListener
{
ChatWnd wnd;
Box box;
JButton icon;
JLabel name;
InetAddress address;
Friend(Icon icon,String name,InetAddress address)
{
box=Box.createHorizontalBox();
this.icon=new JButton(icon);
this.name=new JLabel(name);
this.address=address;
this.icon.addActionListener(this);
}
public void addto(Container con)
{
box.add(icon);
box.add(Box.createHorizontalStrut(10));
box.add(name);
con.add(box);
}
public void actionPerformed(ActionEvent e)
{
if(wnd==null)
{
try
{
wnd=new ChatWnd(address);
wnd.validate();
}
catch(Exception ex){}
}
else
{
wnd.setVisible(true);
}
}
}class FriendsAdd extends JDialog implements ActionListener,ItemListener
{
int count=0;
FriendsWnd upper;
JButton add,add2;JComboBox list;
JPanel panel;
JTextField text1,text2;
JLabel label1,label2;
Icon icon;
FriendsAdd(FriendsWnd f,String s,boolean b)
{
super(f,s,b);
upper=f;
setBounds(500,500,180,150);
setResizable(false);  
setVisible(false);
Container con=getContentPane();
con.setLayout(new BorderLayout());
panel=new JPanel();
panel.setLayout(new FlowLayout());
add=new JButton("确认添加");list=new JComboBox();
list.addItem("kobe.jpg");
list.addItem("xie.jpg");
text1=new JTextField(10);
text2=new JTextField(10);
label1=new JLabel("昵称");
label2=new JLabel("地址");
list.addItemListener(this);
add.addActionListener(this);
con.add(list,BorderLayout.NORTH);
panel.add(label1);
panel.add(text1);
panel.add(label2);
panel.add(text2);
panel.add(add);
con.add(panel);
setDefaultCloseOperation(HIDE_ON_CLOSE);
}
public void itemStateChanged(ItemEvent e)
{
icon=new ImageIcon("D:\\java\\ChatPro\\"+(String)list.getSelectedItem());
}
public void actionPerformed(ActionEvent e)
{
try{
if(icon==null)
icon=new ImageIcon("D:\\java\\ChatPro\\kobe.jpg");
upper.friends[count]=new Friend(icon,text1.getText().trim(),InetAddress.getByName(text2.getText().trim()));
upper.friends[count].addto(upper.pane);
upper.validate();
count++;
}
catch(Exception exception){}
setVisible(false);
}
}class FriendsWnd extends JFrame implements Runnable,ActionListener
{
Friend friends[];
JTextArea pane;
FriendsAdd dialog;
JButton button;
JScrollPane scroll;
FriendsWnd()
{
setBounds(800,200,300,500);
setResizable(false);  
setVisible(true);
Container con=getContentPane();
button=new JButton("添加好友");
dialog=new FriendsAdd(this,"添加好友对话框",true);
button.addActionListener(this);
pane=new JTextArea();
pane.setLayout(new GridLayout(4,1));
pane.setEditable(false);
pane.setBackground(Color.white);
friends=new Friend[8];
scroll=new JScrollPane(pane);
con.add(button,BorderLayout.SOUTH);
con.add(scroll);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread thread=new Thread(this);
thread.start();
}
public void actionPerformed(ActionEvent e)
{
dialog.setVisible(true);
}
public void run()
{
byte data[]=new byte[8192];
DatagramSocket mail_data=null;
DatagramPacket pack=null;
try
{
mail_data=new DatagramSocket(2000);
pack =new DatagramPacket(data,data.length);
}
catch(Exception e){}
while(true)
{
try
{
mail_data.receive(pack);
int length=pack.getLength();
InetAddress address=pack.getAddress();
String message=new String(pack.getData(),0,length);
for(int i=0;i<friends.length;i++)
{if(friends[i].address.toString().equals(address.toString()))
friends[i].wnd.text1.append(friends[i].name.getText()+":"+message+"\n");
}
}
catch(Exception e){}
}
}
}class ChatWnd extends JFrame implements ActionListener
{
JButton send,setadb,add2,add3;
JTextArea text1,text2;
JLabel setadl;
JTextField setadt;
JPanel setadp;
JScrollPane scroll1,scroll2;
JSplitPane split;
InetAddress address;
ChatWnd(InetAddress address)
{
setBounds(300,300,500,500);
setVisible(true);
Container con=getContentPane();
this.address=address;
send=new JButton("发送消息");
setadb=new JButton("确认");
add2 = new JButton("进入聊天室");
add3 = new JButton("退出聊天室");
setadl=new JLabel("目标IP地址");
setadt=new JTextField(10);
setadp=new JPanel();
setadp.add(setadl);
setadp.add(setadt);
setadp.add(setadb);
setadp.add(add2);
setadp.add(add3);
con.add(setadp,BorderLayout.NORTH);
text1=new JTextArea(15,20);
text2=new JTextArea();
scroll1=new JScrollPane(text1);
scroll2=new JScrollPane(text2);
split=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,scroll1,scroll2);
text1.setEditable(false);
text1.setBackground(Color.white);
con.add(split,BorderLayout.CENTER);
con.add(send,BorderLayout.SOUTH);
send.addActionListener(this);
setadb.addActionListener(this);
add2.addActionListener(this);
add3.addActionListener(this);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
public void actionPerformed(ActionEvent event)
{
if(event.getSource()==send)
{
byte buffer[]=text2.getText().trim().getBytes();
try
{
DatagramPacket pack=new DatagramPacket(buffer,buffer.length,address,9999);
DatagramSocket mail_data=new DatagramSocket();
mail_data.send(pack);
text1.append("Me"+":"+new String(buffer,0,buffer.length)+"\n");
}
catch(Exception e){}
}
else if(event.getSource()==setadb)
{
try
{
address=InetAddress.getByName(setadt.getText().trim());
}catch(Exception e){}
}else if(event.getSource()==add2)
{
byte buffer[]="进入聊天室".getBytes();
try
{
address=InetAddress.getByName("192.168.0.3");//该IP地址为服务器所在机子上的IP地址
DatagramPacket pack=new DatagramPacket(buffer,buffer.length,address,9998);
DatagramSocket mail_data=new DatagramSocket();
mail_data.send(pack);
add2.setEnabled(false);
}
catch(Exception e){}
}}}