本帖最后由 郑正华 于 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") 获取的地址是接收端的!
|