java基于UDP实现图片群发功能

  

UDP协议(用户数据报协议)是一种不可靠的网络协议,它在通信实例的两端各建立一个插座,但是这两个套接字之间并没有虚拟链路,这两个套接字只是发送、接收数据报的对象。

  

UDP的优缺点:

  

1。因为UDP协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高。很适合一些即时性很强的应用场景。

  

2。因为在正式通信前不必与对方先连接,不管对方状态就直接发,送至于对方是否可以收到这些数据内容,UDP无法控制,所以说UDP是一种不可靠的协议。

  

3。传输大小限制在64 kb以下,这个尤其要注意,在做这个实例的时候,因为没有考虑到这个,直接传了一张大图,结果找了半天的原因。

  

Java使用DatagramSocket代表UDP协议的插座,它唯一的作用是接收和发送数据报,至于数据究竟发给谁,DatagramSocket并不清楚,具体发送的目的地是由DatagramPacket自身决定。当客户机/服务器程序使用UDP协议时,实际上并没有严格的服务器和客户端的区分。通常固定IP地址,固定端口的DatagramSocket对象所在程序被称为服务器,因为有固定的IP,端口地址,其他客户端的数据报可以直接发送到服务器上。

  

接收数据的DatagramPacket在实例化时无需指定端口和IP地址,给出数据数据的字节数组以及长度即可。然后调用DatagramSocket的接收()方法等待数据报的到来,该方法阻塞线程直到受到一个数据报为止。

  

发送数据的DatagramPacket不同的是,需要给出完整的目的地,包括IP地址和端口,这样数据报才能知道将数据发给谁。当服务器接收到一个DatagramPacket对象后,如果想向该数据报的发送者反馈一些消息,但由于UDP协议是面向非连接的,所以不知道数据报是谁发送过来的,但程序可以调用DatagramPacket的getAddress()(返回一个InetAddress对象,发报的IP地址),getPort()(返回发报的端口)和getSocketAddress()(返回一个SocketAddress对都象,该对象可以同时代表IP地址和端口)。

  

实现思路:每个客户端启动时都会向服务端发送一个字符串,该字符串代表该客户端已经上的线,并在服务端将每个客户端的发报地址(即SocketAddress对都象)保存在一个设置集合中。当点击任意一个上线的客户端的发送图片按钮,该图片数据就会被发送到服务端上,服务端遍历SocketAddress集都合,并将图片数据转发到每个SocketAddress对都应的客户端上,就实现了简单的图片群发。具体代码如下:

  

客户端发送数据报的工具类:

        公开课DatagramUtil   {   公共静态最终int BOADCAST_PORT=8888;   公共静态最终字符串DEST_IP=" 192.168.1.101”;   私有静态最终int DATA_LEN=50000;//定义本程序私聊的套接字实例   私人DatagramSocket singleSocket=零;//定义接收网络数据的字符数组   byte [] inBuff=新字节(DATA_LEN);   私人处理程序处理程序;//构造器,初始化资源   公共DatagramUtil(处理程序处理程序)抛出异常   {   这一点。处理程序=处理程序;//创建用于私聊的DatagramSocket对象   singleSocket=new DatagramSocket ();   新的ReadSingle () .start ();   }//定义单独用户发送消息的方法   公共空间sendSingle (byte[]味精)   {   试一试   {   DatagramPacket包=new DatagramPacket(新字节[0],0,InetAddress.getByName (DEST_IP) BOADCAST_PORT);   packet.setData(味精);   singleSocket.send(包);   }   抓住(IOException e)   {   e.printStackTrace ();   }   }//不断地从DatagramSocket中读取数据的线程   类ReadSingle扩展了线程   {   byte [] singleBuff=新字节(DATA_LEN);   私人DatagramPacket singlePacket=new DatagramPacket (singleBuff singleBuff.length);      @Override   公共空间run ()   {   而(真)   {//读取套接字中的数据   试一试   {//读取套接字中的数据   singleSocket.receive (singlePacket);//处理得到的消息   消息味精=新消息();   味精。=0 x123什么;   味精。obj=singleBuff;   handler.sendMessage(味精);   }   抓住(IOException e)   {   e.printStackTrace ();   如果(singleSocket !=null)   {//关闭该套接字对象   singleSocket.close ();   }   }   }   }   }   }      

收到服务端发来的图片数据时,使用处理器更新UI。

        公开课MainActivity延伸活动   {   私人按钮按钮;   私人ImageView img;   私人DatagramUtil DatagramUtil;   处理程序处理程序=new处理程序()   {   @Override   公共空间handleMessage(消息味精)   {   如果(味精。什么==0 x123)   {   结果byte []=(byte []) msg.obj;   img.setImageBitmap (BitmapFactory.decodeByteArray(因此,0,result.length));   }   }   };      @Override   保护空白>   公开课UDPServer   {   公共静态最终int端口=8888;   私有静态最终int DATA_LEN=50000;   byte [] inBuff=新字节(DATA_LEN);   私人DatagramPacket inPacket=new DatagramPacket (inBuff inBuff.length);   私人DatagramPacket outPacket;   私人DatagramSocket serverSocket;   私人Set

java基于UDP实现图片群发功能