黑马程序员技术交流社区

标题: Socket 发送和接收 [打印本页]

作者: 李志广    时间: 2012-8-2 11:40
标题: Socket 发送和接收
本帖最后由 李志广 于 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") 获取的地址是发送端的还是接收端的呢?




作者: 郑正华    时间: 2012-8-2 12:19
本帖最后由 郑正华 于 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") 获取的地址是接收端的!


作者: 胡文凡    时间: 2012-8-2 13:31
红色部分的数字具体都代表什么啊?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 13:54
本帖最后由 李志广 于 2012-8-2 15:30 编辑
郑正华 发表于 2012-8-2 12:19
import java.net.*;
class UdpSend
{  

谢谢,讲的非常明白!!!!问题已解决!!!:)
作者: 郑正华    时间: 2012-8-2 18:25
李志广 发表于 2012-8-2 13:54
谢谢,讲的非常明白!!!!问题已解决!!!

呵呵,客气~~




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