Advertisement

java udp 同一个端口实现收发_JAVA实现UDP协议:消息的接收和发送

阅读量:
7de30db028e00c0ad819abdb2fb3db28.png

前期知识

如果说通过端到端连接进行通讯的方式——比如像打电话——必须确保双方能够正常通讯(即先拔通再通话),那么类似发短信的是基于 IP 协议实现的一种非连接型传输方式。这种传输方式无需预先建立连接即可完成信息发送(即不管收信方机器是否在线以及地址是否正确均无须在意)。这种传输机制完全由发送方负责(不管接收方是否收到数据)。

代码实现

在同一个界面实现接收和发送

主界面:

复制代码
    public

发送端:

复制代码
 public class MsgSender extends MouseAdapter {

    
 	JTextField  jTextField;
    
  
    
 	public MsgSender(JTextField jTextField1) {
    
 		this.jTextField  = jTextField1 ;
    
 	}
    
  
    
 	public void mouseClicked(MouseEvent e) {
    
 		//UDP发送端:一台机器可能有多个IP地址,
    
 		//把数据以本机192.168.1.147地址上13000号端号,发送到192.168.1.149上的14000端口
    
 		//1.创建要用来发送的本地地址
    
 		try{
    
 		SocketAddress localAddr = new InetSocketAddress("192.168.43.56", 13000);
    
 		//2.创建发送的Socket对象
    
 		DatagramSocket dSender = new DatagramSocket(localAddr);
    
 		while(true){	
    
 			System.out.println(jTextField.getText());
    
 		byte buffer[] = (jTextField.getText()).getBytes();//3.要发送的数据
    
 		 //4.发送数据的目标地址和端口
    
 		SocketAddress destAdd = new InetSocketAddress("192.168.43.56", 14000);
    
 		 //5.创建要发送的数据包,指定内容,指定目标地址
    
 		DatagramPacket dp = new DatagramPacket(buffer, buffer.length, destAdd);
    
 		dSender.send(dp);//6.发送
    
 		System.out.println("数据已发送:!");
    
 		Thread.sleep(1000);
    
 		}//end while
    
 		}catch(Exception e1){
    
 			e1.printStackTrace();
    
 		}
    
 	}
    
 }

接收端:

复制代码
 public class MsgReciver extends Thread{

    
 	DatagramSocket recvSocket;
    
     private JTextField jTextField;
    
 	public MsgReciver(JTextField jTextField2){
    
     	this.jTextField = jTextField2;
    
     }
    
 	public void run() {
    
 		try{
    
 		// TODO Auto-generated method stub
    
 		//1.接收端:在本机接收的机址和等待的端口号
    
 		SocketAddress localAddr = new InetSocketAddress("192.168.43.56", 14000);
    
 		//2.接收的服务器UDP端口
    
 		recvSocket = new DatagramSocket(localAddr);
    
 		 while(true){
    
 		 byte[] buffer = new byte[20]; //3.指定接收缓冲区大小:每个包20字节
    
 		 //4.创建接收数据包对象
    
 		DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    
 		 //5.阻塞等待数据到来,如果收到数据,存入packet中的缓冲区中
    
 		System.out.println("UDP服务器等待接收数据:");
    
 		 recvSocket.receive(packet); //6.在此等待接收对方发的UDP包
    
 		 //得到发送方的IP和端口
    
 		 SocketAddress address = packet.getSocketAddress();
    
 		 //转换接收到的数据为字符串
    
 		 String msg=new String(packet.getData()).trim();
    
 		 //接收到后,打印出收到的数据长度
    
 		 System.out.println("recv is:"+msg+" from:"+address);
    
 		 jTextField.setText("recv is:"+msg+" from:"+address);
    
 		 }
    
 		 }catch(Exception ef){
    
 			 ef.printStackTrace();
    
 		 }
    
 	
    
 }
    
 }

全部评论 (0)

还没有任何评论哟~