黑马程序员-网络编程之UDP传输小总结

来源:互联网 发布:最好用的手机编程软件 编辑:程序博客网 时间:2024/04/28 23:19

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

UDP和TCP
UDP:无连接,不可靠,速度快,数据报大小不超过64k。聊天工具,实时摄像投影软件都是UDP。
TCP:面向连接,通过三次握手监测链接,可靠,速度慢,TCP数据包容量更大。下载软件用的是TCP。

UDP传输:
发送端:
1 创建udp服务,通过DatagramSocket对象。DatagramSocket对象是包投递服务的发送或接受点。
DatagramSocket ds=new DatagramSocket(20000);//为自己指定端口号是20000

2 确定数据,并装成数据包。DatagramPacket类表示数据报包,用于无连接投递服务(udp)
/DatagramPacket(byte[] buf,int lenth,InetAddress address,int port)
//构造数据报包,用来将长度为lenth的发送到指定主机上的指定端口号
byte[] data="
我是udp

".getBytes();
DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),10000);

3 通过socket服务,将已有的数据包发送出去,通过send方法。
ds.send(dp);

4 关闭资源。
ds.close();

接收端:
1 创建udpsocket服务,建立端点
DatagramSocket ds=new DatagramSocket(10000);//监听10000端口,也就是为自己指定端口为10000

2 定义数据包。用于存储接收来的数据包。
//DatagramPacket(byte[]buf,int length)构造DatagramPacket,用来接收长度为length的数据包
byte[]buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);

3 通过服务的receive方法将收到的数据存入数据包中。这是一个阻塞式方法,线程机制,就是说没有数据来,程序就停在这里等到数据来再向下执行。
ds.receive(dp);

4 通过数据包的方法获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();//返回这个包的目的端口号(发送的时候)或者源端口号(接收的时候)。每个程序都会被系统自动随机分配一个端口号,即使程序不变,每次随机分配一个。
System.out.println(ip+"::"+data+"::"+port);

//5关闭资源
ds.close();

点对点单向聊天软件的制作,详情见UDPDemo.java 和UDPDemo2.java,用dos命令窗口来实现。
如果想实现群聊,可以把ip最后一位设为255.
利用多线程实现可以同时收发信息的聊天软件。
实现代码如下:

/*编写一个聊天程序 * 有收数据的部分和发数据的部分 * 这两个部分需要同时执行,所以用到多线程技术 * 一个线程控制收,一个线程控制发 * 因为收和发的动作是不一致的,所以要定义两个run方法 * 而且这两个run方法要封装到不同的类中*/class Send1 implements Runnable{DatagramSocket ds;DatagramPacket dp;Send1(DatagramSocket ds){this.ds=ds;}public void run() {BufferedReader br=null;try {br=new BufferedReader(new InputStreamReader(System.in));String s=null;while((s=br.readLine())!=null){if(s.equals("over"))break;byte[] data=s.getBytes();dp=new DatagramPacket(data,0,data.length,InetAddress.getByName("127.0.0.1"),10003);ds.send(dp);}} catch (Exception e) {throw new RuntimeException("发送端出问题了");}finally{try {br.close();ds.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}class Receive1 implements Runnable{DatagramSocket ds;Receive1(DatagramSocket ds){this.ds=ds;}public void run() {try {while(true){byte[] data=new byte[1024];DatagramPacket dp=new DatagramPacket(data,data.length);ds.receive(dp);String s=new String(dp.getData(),0,dp.getLength());System.out.println(dp.getAddress().getHostAddress()+"的"+dp.getPort()+"端口号说:"+s);}} catch (Exception e) {throw new RuntimeException("接收端出问题了");}}}class ChatDemo{public static void main(String[]args) throws Exception{DatagramSocket sendSocket=new DatagramSocket();DatagramSocket receiveSocket=new DatagramSocket(10003);new Thread(new Send1(sendSocket)).start();new Thread(new Receive1(receiveSocket)).start();}}


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

0 0