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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-8-2 11:40  /  1608 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李志广 于 2012-8-2 11:52 编辑

import java.net.*;
class UdpSend
{
        public static void main(String[] args) throws Exception
                {
                DatagramSocket ds=new DatagramSocket(8888);
                byte[] buf="I'm coming back,this summer".getBytes();
                DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.6"),10000);
                ds.send(dp);
                ds.close();
                }
}
class UdpRec
{
        public static void main(String[] args)throws Exception
                {
                DatagramSocket ds=new DatagramSocket(10000);
                byte[] buf=new byte[1024];
                DatagramPacket dp=new DatagramPacket(buf,buf.length);
                ds.receive(dp);
                String ip=dp.getAddress().getHostAddress();
                String data=new String(dp.getData(),0,dp.getLength());
                int port=dp.getPort();
                System.out.println(ip+":"+data+":"+port);
                }
}
看了毕老师的视频后有点疑惑:红色部分的数字具体都代表什么啊?DatagramSocket ds=new DatagramSocket(8888); 为什么设置为8888后,输出端就一直是:8888?而如果不设置,输出的数字就会不断的变化?
还有,两个10000 是不是必须保持一致呢?InetAddress.getByName("192.168.0.6") 获取的地址是发送端的还是接收端的呢?



4 个回复

倒序浏览
本帖最后由 郑正华 于 2012-8-2 12:34 编辑

import java.net.*;
class UdpSend
{  
        public static void main(String[] args) throws Exception  
                {  
                DatagramSocket ds=new DatagramSocket(8888);  ←这里代表发送端从哪个端口发送出去的!
                byte[] buf="I'm coming back,this summer".getBytes();  
                DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.6"),10000); ←这里代表发送到IP地址为192.168.0.6的主机上的10000端口上
                ds.send(dp);
                ds.close();   
                }  
}  
class UdpRec  
{  
        public static void main(String[] args)throws Exception  
                {  
                DatagramSocket ds=new DatagramSocket(10000);  ←这里代表接收端的端口号
                byte[] buf=new byte[1024];   
                DatagramPacket dp=new DatagramPacket(buf,buf.length);  
                ds.receive(dp);  
                String ip=dp.getAddress().getHostAddress();
                String data=new String(dp.getData(),0,dp.getLength());  
                int port=dp.getPort();   
                System.out.println(ip+":"+data+":"+port);  
                }
}

为什么设置为8888后,输出端就一直是:8888?而如果不设置,输出的数字就会不断的变化?
答:因为设置了固定的端口号后,发送端就当然会以设置好的端口号发送数据,而如果不设置的话,系统就会随机给发送端打了个标示,也就是端口, 让发送端以这个端口号进行数据发送,那这个数字(端口号)为什么会不断的变化呢?因为端口号被发送端用了以后,这个端口号还没有被释放,还存在内存当中,所以就会不断的变化,而且这个数字(端口号)会以某个位置开始进行递增(顺延)。

还有,两个10000 是不是必须保持一致呢?InetAddress.getByName("192.168.0.6") 获取的地址是发送端的还是接收端的呢?
答:必须要一致,端口号代表着应用程序的入口,如果你不指定端口号,就不知道该和哪个应用程序进行通讯了,给你举个生活中的例子,就把门牌号想象成端口号,比如我要给你家邮寄包裹,那你肯定要声明告诉我 你家的门牌号吧,那我到邮局给你家寄东西时上面肯定要写上你家的地址和门牌号吧,
也就是(buf,buf.length,InetAddress.getByName("192.168.0.6"),10000);

InetAddress.getByName("192.168.0.6") 获取的地址是接收端的!

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
红色部分的数字具体都代表什么啊?DatagramSocket ds=new DatagramSocket(8888); 为什么设置为8888后,输出端就一直是:8888?(是)而如果不设置,输出的数字就会不断的变化(随即一个值但不是不断变化)?还有,两个10000 是不是必须保持一致呢(是)?因为开始发送端必须必须指定一个接收端的端口,接收端端口必须与此一致
InetAddress.getByName("192.168.0.6") 获取的地址是发送端的还是接收端的呢?获取的地址是接收端的
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.6"),10000);
这句话里面红色部分都是指定接收端的。表示接收端的地址以及接收端端口。即是指明数据包往哪里发

回复 使用道具 举报
本帖最后由 李志广 于 2012-8-2 15:30 编辑
郑正华 发表于 2012-8-2 12:19
import java.net.*;
class UdpSend
{  

谢谢,讲的非常明白!!!!问题已解决!!!:)
回复 使用道具 举报
李志广 发表于 2012-8-2 13:54
谢谢,讲的非常明白!!!!问题已解决!!!

呵呵,客气~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马