A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王飞 中级黑马   /  2012-7-17 10:25  /  1750 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王飞 于 2012-7-17 11:55 编辑



import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class aa {

        public static void main(String[] args)throws Exception {
                //1.创建udp服务                 
                DatagramSocket ds = new DatagramSocket();  
               
                //2.确定数据,并封装成数据包                 
                // byte[] buf = "ni hao a".getBytes();
                 //DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.101"),11);
               
                此处为什么要封装包?我不封装直接读取岂不方便。
                 我不封装包不行吗    往流中直接写入字节数据 ds.send("行不行啊".getBytes());不是更方便吗?本人认为为何要多此一举呢。。。
                 有点不解

      
                 
                //3.通过Socket服务讲数据发送出去
                // ds.send(dp);
                 
                //4.关闭资源
                 ds.close();

        }

}

class UDP2 {
         
        public static void main(String[] args)throws Exception {
                //1.创建sockect服务,建立端点
                DatagramSocket ds = new DatagramSocket(11);
               
                //2.建立数据包,用于存储数据                        
                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());
                System.out.println("ip:"+ip+"------"+"data:"+data);
               
                //5.关闭资源
                ds.close();
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
为什么使用DatagramPackage ?
那你得先好好了解以下UDP的特点,在复习下网络原理,在网络中数据都是以数据包的形式传送的,并且数据包是有一定格式的,有包头啦什么的,
源ip,目的ip,数据。。。使用DatagramPackage 无非就是封装这些信息。
下面是API的介绍:
DatagramPackage
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
关于udp协议的网络编程 他是面向无连接的 是没有方向的 所以不能将数据写入流中传输  
而是必须将数据通过DatagramSocket封装处理 让后把数据包投递出去
可以对比一下 tcp协议的网络编程 是面向连接的 在tcp中 首先建立socket服务 然后进行io流操作
具体说明:
UDP是没有“方向”的,所以用DatagramePacket既发送数据,又接收数据。但是TCP是有“方向”的连接,因此用两个类Socket 、ServerSocket分别表示客户端和服务器端, TCP先形成Socket的“通路”,然后再通过IO流在这条通路上进行数据的传输。即ServerSocket先接收到客户端的Socket,然后调用此Socket中的IO流实现数据的流传输。

回复 使用道具 举报
首先UDP楼主把它想成在邮局寄包裹。
UDP的机制首先它是不用先建立连接的!所以你把它投递出去之后,包裹本身就是一个对象。
对方接收到了包裹,发送方跟接收方有联系吗?没有!
所以最后的依据只有包裹本身。这不是麻烦不麻烦的问题。而是安全隐患的问题!
回复 使用道具 举报
哦哦  明白了
诸位 谢了{:soso_e183:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马