首页 > 代码库 > 同一个 DatagramPacket 对象可以被重用,用来多次发送或接收数据
同一个 DatagramPacket 对象可以被重用,用来多次发送或接收数据
package datagram;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class DatagramTester { private int port = 8000; private DatagramSocket sendSocket; private DatagramSocket receiveSocket; private static final int MAX_LENGTH = 3584; public DatagramTester() throws IOException { sendSocket = new DatagramSocket(); receiveSocket = new DatagramSocket(port); receiver.start(); sender.start(); } public static byte[] longToByte(long[] data) throws IOException { ByteArrayOutputStream bao = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bao); for(int i=0; i<data.length; i++) { dos.writeLong(data[i]); } dos.close(); return bao.toByteArray(); } public static long[] byteToLong(byte[] data) throws IOException { long[] result = new long[data.length/8]; ByteArrayInputStream bai = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bai); for(int i=0; i<data.length/8; i++) { result[i] = dis.readLong(); } return result; } public void send(byte[] bigData) throws IOException { DatagramPacket packet = new DatagramPacket(bigData, 0, 512, InetAddress.getByName("localhost"), port); int bytesSent = 0; int count = 0; while(bytesSent < bigData.length) { sendSocket.send(packet); System.out.println("SendSocket > 第" + (++count) + "次发送了" + packet.getLength() + "个字节"); bytesSent += packet.getLength(); int remain = bigData.length - bytesSent; int length = (remain > 512) ? 512 : remain; packet.setData(bigData, bytesSent, length); } } public byte[] receive() throws IOException { byte[] bigData = http://www.mamicode.com/new byte[MAX_LENGTH]; DatagramPacket packet = new DatagramPacket(bigData, 0, MAX_LENGTH); int bytesReceived = 0; int count = 0; long beginTime = System.currentTimeMillis(); while((bytesReceived < bigData.length) && (System.currentTimeMillis() - beginTime < 60000*5)) { receiveSocket.receive(packet); System.out.println("ReceiveSocket > 第" + (++count) + "次接收到" + packet.getLength() + "个字节"); bytesReceived += packet.getLength(); packet.setData(bigData, bytesReceived, MAX_LENGTH - bytesReceived); } return packet.getData(); } public Thread sender = new Thread() { public void run() { long[] longArray = new long[MAX_LENGTH/8]; for(int i=0; i<longArray.length; i++) { longArray[i] = i+1; } try { send(longToByte(longArray)); } catch (IOException e) { e.printStackTrace(); } } }; public Thread receiver = new Thread() { public void run() { try { long[] longArray = byteToLong(receive()); for(int i=0; i<longArray.length; i++) { if(i%100 == 0) System.out.println(); System.out.print(longArray[i] + ""); } } catch (IOException e) { e.printStackTrace(); } } }; public static void main(String[] args) throws IOException { new DatagramTester(); }}
同一个 DatagramPacket 对象可以被重用,用来多次发送或接收数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。