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();
}
}
}
}