java----UDP编程实例

一、主机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();

	}
}


三、 效果展示


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值