基于UDP协议的文件传输
package udp;import java.net.*;public class TestUDPClient{public static void main(String args[]) throws Exception{//定义码头dsDatagramSocket ds = new DatagramSocket();//13行到23行完成的功能是: 定义可以发送数据的集装箱dpString n = "123"; //13行//ByteArrayOutputStream baos = new ByteArrayOutputStream();//注意ByteArrayOutputStream的所有构造函数都没有byte[] buf这样的形参,即定义ByteArrayOutputStream流对象时是不能指定byte数组的,因为这个连接到的byte数组是由ByteArrayOutputStream自动生成的9行API:"public ByteArrayOutputStream(): 创建一个新的 byte 数组输出流。缓冲区的容量最初是 32 字节,如有必要可增加其大小。 "////9行代码一旦执行完毕,意味着两点: 1、在内存中生成了一个大小为32个字节的byte数组 2、有一根叫做baos的管道已链接到了该byte数组中,并且可以通过这个管道向该数组中写入数据////虽然此时可以通过baos向baos所连接到的在内存中分配好的byte数组中写入数据,但是ByteArrayOutputStream流并没有提供可以直接把long类型数据直接写入ByteArrayOutputStream流所连接到的byte数组中的方法, 简单说我们没法通过baos向baos所连接到的byte数组中写入long类型的数据, 查API文档可以发现: ByteArrayOutputStream流中并没有类似writeLong()这样的方法,但是DataOutputStream流中却有writeLong() writeFloat()等方法//DataOutputStream dos = new DataOutputStream(baos);//dos.writeUTF(n);//把n变量所代表的10000L写入dos所依附的baos管道所连接到的内存中的大小为32字节的byte数组中//byte[] buf = baos.toByteArray();//DataOutputStream 流中并没有toByteArray()方法,但是ByteArrayOutputStream 流中却有toByteArray()方法, 所以不可以把baos 改为dos,否则编译时会出错! ByteArrayOutputStream流中toByteArray()方法的含义,摘自API“创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中”DatagramPacket dp = new DatagramPacket(n.getBytes(),n.getBytes().length, new InetSocketAddress("127.0.0.1", 6666) );//23行//在码头上把集装箱中的数据发送给对方ds.send(dp);//关闭码头ds.close();}}package udp;import java.net.*;public class TestUDPServer{public static void main(String args[]) throws Exception{//定义码头DatagramSocket ds = new DatagramSocket(6666);//5678表示该码头占用的是5678这个编号,因为一台计算机可以有多个码头接收多个数据,这些码头用不同的编号来表示,这些编号的专业术语就是端口号//定义可以用来接受数据的集装箱byte buf[] = new byte;DatagramPacket dp = new DatagramPacket(buf, buf.length);try{while(true){//在码头上用集装箱接受对方发送过来的数据ds.receive(dp); //注意:本语句执行完毕就意味着,dp数据包中就已经含有了从客户端接收过来的数据//从集装箱中取出对方发送过来的数据String str=new String(dp.getData(),0,dp.getLength());//ByteArrayInputStream bais = new ByteArrayInputStream(dp.getData()); //1、 ByteArrayInputStream的内核必须是个字节数组,并且是从该字节数组中读取数据2、dp.getData()表示把dp集装箱中的数据转化为一个字节数组并返回该字节数组//BufferedReader dis = new BufferedReader(new InputStreamReader(bais));System.out.println(str); }}catch (Exception e){e.printStackTrace();ds.close();//关闭码头}}}/*在JDK 1.6中的运行结果是:----------------------------------10000数据源自: 127.0.0.1 : 146410000数据源自: 127.0.0.1 : 147110000数据源自: 127.0.0.1 : 1474----------------------------------*/
页:
[1]