import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
/*
* 用UDP编写的聊天程序
*/
public class UDPChat {
Frame f = new Frame("我的聊天室");
TextField tfIP = new TextField(15);
/*
tfd是用于输入IP地址的文本框,在发送数据时,要取出其中的IP地址,
所以将其定义成为变量,以便发送消息的程序代码访问
*/
List lt = new List(6);
/*
lt是用于显示接受消息的列表框,在接受到数据时,
要向其中增加新的记录项,所以将其定义为成员变量,
以便接收消息程序代码访问
*/
DatagramSocket ds;
/*
* 由于DatagramSocket的构造函数声明可能抛出异常,我们的程序需要用try...catch语句
* 进行异常捕获处理,所以不能直接在这里调用DatagramSocket的构造方法对ds进行初始化,
* 我们需要将ds的初始化放在Chat类的构造方法中去完成。
*/
public UDPChat(){
try{
ds = new DatagramSocket(3000);
}catch(Exception e){
e.printStackTrace();
}
new Thread(new Runnable(){
public void run(){
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
while(true){
try{
ds.receive(dp);
lt.add(new String(buf,0,dp.getLength())+":from"+dp.getAddress().getHostAddress(),0);
}catch(Exception e){
e.printStackTrace();
}
}
}
}).start();
}
public static void main(String[] args){
UDPChat chat = new UDPChat();
chat.init();
}
public void init(){
f.setSize(300,300);
f.add(lt);
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add("West",tfIP);
TextField tfData = new TextField(20);
p.add("East",tfData);
f.add("South",p);
f.setVisible(true);
f.setResizable(false);//限制用户改变窗口的大小
//增加关闭窗口的事件处理代码
f.addWindowListener(new WindowAdapter(){
@SuppressWarnings("unused")
public void windowCloseing(WindowEvent e){
ds.close();//程序退出时,关闭Socket,释放相关资源
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
//增加在消息文本框中按下回车键的事件处理代码
tfData.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//要在这里增加网络消息发送相关程序
//取出文本框中的消息字符串,并将其转换成字节数组
byte[] buf;
buf = e.getActionCommand().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),3000);
try {
ds.send(dp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//下面的语句用于数据发送后,清空文本框中原来的内容
((TextField)e.getSource()).setText("");
}
});
}
}