一、主机1代码
package org.UDP;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPDemo01 extends JFrame implements Runnable,ActionListener
{
JTextField sendMsg = new JTextField(20);
JTextArea receiveMsg = new JTextArea();
JButton send = new JButton("发送");
public UDPDemo01()
{
setTitle("主机1");
setSize(400,300);
setVisible(true);
Container container = this.getContentPane();
container.setLayout(new BorderLayout());
JScrollPane centerPane = new JScrollPane();
centerPane.setViewportView(receiveMsg);
container.add(centerPane,BorderLayout.CENTER);
receiveMsg.setEditable(false);
JPanel bottomJPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
bottomJPanel.add(new JLabel("信息"));
bottomJPanel.add(sendMsg);
bottomJPanel.add(send);
container.add(bottomJPanel,BorderLayout.SOUTH);
send.addActionListener(this);
sendMsg.addActionListener(this);
this.setDefaultCloseOperation(JFrame .EXIT_ON_CLOSE);
}
//点击按钮发送数据包,或是在文本输入框里打回车发送文本
public void actionPerformed(ActionEvent e)
{
byte buffer[] = sendMsg.getText().trim().getBytes();
//trim() 返回字符串的副本,忽略前导空白和尾部空白。
try
{ //将数据封装到数据报,指定发送目的的端口号
InetAddress destAddress = InetAddress.getByName("localhost");
DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length,destAddress,7777);
DatagramSocket sendSocket = new DatagramSocket();
receiveMsg.append("==========本地消息==========\n");
receiveMsg.append("数据报目标主机地址:"+dataPacket.getAddress()+"\n");
receiveMsg.append("数据报目标端口是:"+dataPacket.getPort()+"\n");
receiveMsg.append("数据报长度:"+dataPacket.getLength()+"\n");
sendSocket.send(dataPacket);//向异地发送数据包
sendMsg.setText("");
}
catch (Exception e2)
{
}
}
public void run()
{
DatagramSocket receiveSocket = null;
DatagramPacket receivePacket = null;
byte buff[] = new byte[8192];
try
{
receivePacket = new DatagramPacket(buff, buff.length);
receiveSocket = new DatagramSocket(9999);//接收端口号为9999
}
catch (Exception e)
{
}
while(true)
{
if(receiveSocket == null)//如果套接字为空,则跳出死循环
break;
else
{
try
{
receiveSocket.receive(receivePacket);
int length = receivePacket.getLength();
InetAddress adress = receivePacket.getAddress();
int port = receivePacket.getPort();
String message = new String(receivePacket.getData(),0,length);
receiveMsg.append("==========异地消息==========\n");
receiveMsg.append("收到的数据来自:"+adress+"端口:"+port+"\n");
receiveMsg.append("收到的数据长度:"+length+"\n");
receiveMsg.append("收到的数据是:"+message+"\n");
}
catch (Exception e)
{
// TODO: handle exception
}
}
}
}
public static void main(String[] args)
{
new Thread(new UDPDemo01()).start();//线程用来接收数据包
}
}
二、 主机2代码
package org.UDP;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPDemo02 extends JFrame implements Runnable,ActionListener
{
private static final long serialVersionUID = 571947392083381308L;
JTextField sendMsg = new JTextField(20);
JTextArea receiveMsg = new JTextArea();
JButton send = new JButton("发送");
public UDPDemo02()
{
setTitle("主机2");
setSize(400,300);
setVisible(true);
Container container = this.getContentPane();
container.setLayout(new BorderLayout());
JScrollPane centerPane = new JScrollPane();
centerPane.setViewportView(receiveMsg);
container.add(centerPane,BorderLayout.CENTER);
receiveMsg.setEditable(false);
JPanel bottomJPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
bottomJPanel.add(new JLabel("信息"));
bottomJPanel.add(sendMsg);
bottomJPanel.add(send);
container.add(bottomJPanel,BorderLayout.SOUTH);
send.addActionListener(this);
sendMsg.addActionListener(this);
Thread thread = new Thread(this);
thread.start();
this.setDefaultCloseOperation(JFrame .EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
byte buffer[] = sendMsg.getText().trim().getBytes();
//trim() 返回字符串的副本,忽略前导空白和尾部空白。
try
{
InetAddress destAddress = InetAddress.getByName("localhost");
DatagramPacket dataPacket = new DatagramPacket(buffer, buffer.length,destAddress,9999);
DatagramSocket sendSocket = new DatagramSocket();
receiveMsg.append("==========本地消息==========\n");
receiveMsg.append("数据报目标主机地址:"+dataPacket.getAddress()+"\n");
receiveMsg.append("数据报目标端口是:"+dataPacket.getPort()+"\n");
receiveMsg.append("数据报长度:"+dataPacket.getLength()+"\n");
sendSocket.send(dataPacket);
sendMsg.setText("");
}
catch (Exception e2)
{
}
}
public void run()
{
DatagramSocket receiveSocket = null;
DatagramPacket receivePacket = null;
byte buff[] = new byte[8192];
try
{
receivePacket = new DatagramPacket(buff, buff.length);
receiveSocket = new DatagramSocket(7777);
}
catch (Exception e)
{
}
while(true)
{
if(receiveSocket == null)
break;
else
{
try
{
receiveSocket.receive(receivePacket);
int length = receivePacket.getLength();
InetAddress adress = receivePacket.getAddress();
int port = receivePacket.getPort();
String message = new String(receivePacket.getData(),0,length);
receiveMsg.append("==========异地消息==========\n");
receiveMsg.append("收到的数据来自:"+adress+"端口:"+port+"\n");
receiveMsg.append("收到的数据长度:"+length+"\n");
receiveMsg.append("收到的数据是:"+message+"\n");
}
catch (Exception e)
{
// TODO: handle exception
}
}
}
}
public static void main(String[] args)
{
new UDPDemo02();
}
}
三、 效果展示