import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.HeadlessException;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPCommunicationTest extends Frame implements Runnable{
private List list = new List(6);
private TextField ipTextField = new TextField(15);
private TextField contenTextField = new TextField(18);
private static UDPCommunicationTest communicationTest = null;
private static DatagramSocket datagramSocket = null;
public static void main(String[] args) {
communicationTest = new UDPCommunicationTest();
communicationTest.buildWindow();
communicationTest.contentClickEvent();
//当我们点击关闭窗口按钮的时候,释放资源,退出改程序,并且把socket关闭
communicationTest.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
super.windowClosing(e);
datagramSocket.close();
communicationTest.setVisible(false);
communicationTest.dispose();
System.exit(0);
}
});
}
public UDPCommunicationTest()
throws HeadlessException {
try {
//这个参数表示接受数据的端口号
datagramSocket = new DatagramSocket(3000);
new Thread(this).start();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//这是创建一个通信的窗口
public void buildWindow()
{
this.add(list, BorderLayout.CENTER);
Panel panel = new Panel();
panel.setLayout(new BorderLayout());
ipTextField.setText("192.168.1.101");
panel.add(ipTextField, BorderLayout.WEST);
contenTextField.setText("请输入发送信息:");
panel.add(contenTextField, BorderLayout.EAST);
this.add(panel, BorderLayout.SOUTH);
this.setBounds(400, 200, 300, 400);
this.setVisible(true);
this.setResizable(false);
}
//这是当我们点击回车按钮的时候就发送信息出去
public void contentClickEvent()
{
contenTextField.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) { try { String ip = ipTextField.getText(); String content = contenTextField.getText(); DatagramPacket p = new DatagramPacket(content.getBytes(), content.getBytes().length, InetAddress.getByName(ip), 3000); datagramSocket.send(p); contenTextField.setText(""); } catch (Exception e1) { e1.printStackTrace(); } } }); } //这是开启另外一个线程对数据进行接受,并且将数据添加到list里面 public void run() { byte [] buf = new byte[1024]; DatagramPacket datagramPacket = new DatagramPacket(buf, 1024); try { while(true) { datagramSocket.receive(datagramPacket); int len = datagramPacket.getLength(); String ip = datagramPacket.getAddress().getHostAddress(); int port = datagramPacket.getPort(); //第二个参数是将数据加在list的第一行 list.add(new String(buf, 0, len) + " from " + ip + " : " + port, 0); } } catch (Exception e) { if(datagramSocket.isClosed()) { }else { e.printStackTrace(); } } } }