java的UDP进行通信的一个小案例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值