标签:
☆ UDP:
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
DatagramSocket和
DatagramPacket类
UDP传输:
DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
UDP传输编程:
☆发送端
在发送端,要在数据包对象中明确目的地IP及端口。
DatagramSocket ds = new DatagramSocket(); byte[] by = “hello,udp”.getBytes(); DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000); ds.send(dp); ds.close();☆接收端
在接收端,要指定监听的端口。
DatagramSocket ds = new DatagramSocket(10000); byte[] by = new byte[1024]; DatagramPacket dp = new DatagramPacket(by,by.length); ds.receive(dp); String str = new String(dp.getData(),0,dp.getLength()); System.out.println(str+"--"+dp.getAddress()); ds.close();示例:
发送方:
package cn.hncu.url.udp;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendDemo {
public static void main(String[] args) {
try {
// send1();//这个方法演示的是发送小数据
send2();//这个方法演示的是发送较大数据
} catch (Exception e) {
e.printStackTrace();
}
}
private static void send2() throws Exception {
//for sending larger packet
DatagramSocket ds=new DatagramSocket(10000);//这里指定端口号10000,各程序上的端口号都是唯一的,一个程序中要新建多个DatagramSocket需要使用不同的端口号
InputStream in=new FileInputStream("file.txt");
BufferedInputStream bis=new BufferedInputStream(in);
byte buf[]=new byte[1024];
buf[0]=0;
int len=0;
while ((len=bis.read(buf, 1, buf.length-1))!=-1){//这里我把数组第一位留出来作为判断文件是否读取完毕的标记
if (len<1023){
buf[0]=1;//文件读取完毕后位置0设为1,这样做是为了接收方的关闭动作,若不这样做的话不管是否读取完接收 //方会一直开着
}
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"), 10001);
//上一行的ip地址我用xxx.xxx.xxx.xxx表示,运行程序时记得改成你自己的ip地址,下同
ds.send(dp);
}
ds.close();
}
private static void send1() throws Exception {
//for sending less packet
DatagramSocket ds=new DatagramSocket(10000);
String str="你知道吗,god is a girl";
byte buf[]=str.getBytes("utf-8");
//DatagramPacket类中,有ip地址的构造方法是用来创建发送数据包的
DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"),10001);//注意,IP和端口都是接收方的
ds.send(dp);
ds.close();
}
}接收方:
package cn.hncu.url.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) {
try {
// receive1();//接收小数据
receive2();//接收较大数据
} catch (Exception e) {
e.printStackTrace();
}
}
private static void receive2() throws Exception {
//for receiving larger packet
DatagramSocket ds=new DatagramSocket(10001);
byte buf[]=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
while (true){
ds.receive(dp);
//从dp中解析出我们想要的信息
//获取ip
byte data[]=dp.getData();
String info=new String(data,1,data.length-1);
System.out.println(info);
if (data[0]==1){
ds.close();
}
}
}
private static void receive1() throws Exception {
//for receiving less packet
DatagramSocket ds=new DatagramSocket(10001);
byte buf[]=new byte[1024];
//DatagramPacket类中,没有ip地址的构造方法是用来创建接收数据包的
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
//从dp中解析出我们想要的信息
//获取ip
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
byte data[]=dp.getData();
String info=new String(data);
System.out.println(ip+":"+port+"----"+info);
}
}
标签:
原文地址:http://blog.csdn.net/x121850182/article/details/51346160