黑马程序员技术交流社区

标题: UDP传输问题 [打印本页]

作者: 徐军涛    时间: 2012-11-11 11:31
标题: UDP传输问题
UDP传输时,没有涉及Socket IO流,具体是在怎么进行数据传输的?
作者: 许坤    时间: 2012-11-11 11:41
java里UDP协议传送的方式细节已经封装了到类DatagramSocket里了,只要用DatagramSocket的对象进行传输数据就可以了.
作者: 徐军涛    时间: 2012-11-11 12:23
许坤 发表于 2012-11-11 11:41
java里UDP协议传送的方式细节已经封装了到类DatagramSocket里了,只要用DatagramSocket的对象进行传输数据就 ...

刚想了一下,因为UDP传输时不可靠的,面向的无连接,即不需要建立传输通道;就会有以下情况
1,建立单一的UDP的发送端或接收端,因为没有连接,所以应该不涉及流向即没有IO流关联。
2,建立绑定地址和端口的UDP发送端和接收端,看有连接(我们知道UDP是面向无连接的),应该有流。
所以我就比较纠结了,理论上来讲,面向无连接,就没有“流”,即DatagramSocket应该和IO关联;
但是有传输,理论上来讲,有传输就会有“流”,所以就不明白这个“传输”是怎么进行传输的?
希望有人能详细讲解下。
作者: 廖智    时间: 2012-11-11 12:55
本帖最后由 廖智 于 2012-11-11 14:27 编辑

UDP的传输方式:
1、建立Socket服务点,Socket服务点中提供了send方法发送。
2、将数据封装成包,并明确要发送的IP,端口号。如果没有对应的IP和端口号,数据会丢失。
3、用send方法将数据包发送。

作者: 徐军涛    时间: 2012-11-11 14:50
廖智 发表于 2012-11-11 12:55
UDP的传输方式:
1、建立Socket服务点,Socket服务点中提供了send方法发送。
2、将数据封装成包,并明确要 ...

哥们给力哦:loveliness:
作者: 王晓州    时间: 2012-11-14 01:38
本帖最后由 werewolf 于 2012-11-14 01:40 编辑
徐军涛 发表于 2012-11-11 12:23
刚想了一下,因为UDP传输时不可靠的,面向的无连接,即不需要建立传输通道;就会有以下情况
1,建立单一 ...


你觉得发送端和接收端看似有连接,那么是什么在连接呢?//数据报包和接收端
如果创建DatagramSocket和IO关联的话,那么如何发送数据呢?
目标,端口改如何定义呢?
所以我觉得它的传输就是数据报包到接收端的传输,因此要和IO关联的也应该是数据报包。

UDP理论传输数据长度限定在64k以内,但是实际上应用中由于以太网协议等等原因,通常都会限制UDP包的大小有的限制到8192字节,有的更小,不到600字节,所以我想着就是JAVA设计者根本就没考虑数据报包和IO直接关联的原因吧!
但是我们可以自己创建IO流啊,循环将读取流中读到的数据封装到字节数组中(因为数据报包和字节数组关联)传输。


作者: jerry2627    时间: 2012-11-14 16:10
打包成数据报啊
作者: 黑马张旭    时间: 2012-11-14 19:42
UDP传输:

1.      创建UDP的socket服务对象 DatagramSocket,建立发送端,接收端。

2.      创建UDP的数据包对象 DatagramPacket,将要传输的数据封装到数据包中。

3.      调用Socket的发送接收方法。

4.      关闭Socket。



发送端与接收端是两个独立的运行程序。



Ⅰ,DatagramSocket

  DatagramSocket有如下构造方法:

  1,DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。

  2,DatagramSocket(intport):创建数据报套接字并将其绑定到本地主机上的指定端口。

  3,DatagramSocket(intport, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.

  如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.

  发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.

  发送数据使用DatagramSocket.send(DatagramPacketp)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.



Ⅱ,DatagramPacket

  DatagramPacket类有如下构造方法:

  1,DatagramPacket(byte[]buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。

  2,DatagramPacket(byte[]buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。

  接收数据时使用第一种构造方法,发送数据时使用第二种构造方法.

  1.3,InetAddress

  Java中对IP地址进行包装的类,

  DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.



    发送端 示例:

  在发送端,要在数据包对象中明确目的地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();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2