基于UDP协议的文件传输

package udp;
import java.net.*;
public class TestUDPClient
{
	public static void main(String args[]) throws Exception
	{
		//定义码头ds
		DatagramSocket ds = new DatagramSocket();
		//13行到23行完成的功能是: 定义可以发送数据的集装箱dp
		String 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[1024];
		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 : 1464
10000
数据源自: 127.0.0.1 : 1471
10000
数据源自: 127.0.0.1 : 1474
----------------------------------
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值