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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 赵亚威 于 2013-4-2 16:17 编辑

public class SocketDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
         
                DatagramSocket ds = null;
        try {
                        ds=new DatagramSocket();
                        
                        byte[] buf="wo shi yi ge shu zu".getBytes();
                        DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);
             ds.send(dp);
                        
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        if(ds!=null)
                        ds.close();
                }
        }

}
class SocketRecev{
        public static void main(String[] args){
                DatagramSocket ds=null;
                try {
                        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);//port为什么不是10000
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        if(ds!=null)
                        ds.close();
                }
        }
        
}
运行后的结果:
127.0.0.1:wo shi yi ge shu zu:54397

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
这个返回的port是客户端的端口  不是服务端的
回复 使用道具 举报
在这里你返回的是客户端的端口,客户端端口你不指定的时候,它是一个系统随机分配
而且每次分配的都不一样
你说指定,那是指定服务端的端口
回复 使用道具 举报
一个客户端,一个服务器端
回复 使用道具 举报
10000这个端口号用于接收传过来的数据包,当DatagramSocket收到数据包后,填充DatagramPacket数据包,从这个数据包中获取的端口是远程主机发送数据的端口.所以获取的端口当然是不一样的.
回复 使用道具 举报
本帖最后由 邓宫财 于 2013-4-2 15:21 编辑
  1. public class SocketDemo {
  2.         public static void main(String[] args) {
  3.                 DatagramSocket ds = null;
  4.                 try {
  5.                         //这里需要指定发送端的端口号,不然就是随机的。
  6.                         ds = new DatagramSocket(10583);

  7.                         byte[] buf = "wo shi yi ge shu zu".getBytes();
  8.                         DatagramPacket dp = new DatagramPacket(buf, buf.length,
  9.                                         InetAddress.getByName("127.0.0.1"), 10000);//这里的10000是指发送到接收端的端口号
  10.                         ds.send(dp);

  11.                 } catch (IOException e) {
  12.                         e.printStackTrace();
  13.                 } finally {
  14.                         if (ds != null)
  15.                                 ds.close();
  16.                 }
  17.         }

  18. }
复制代码
修改了你的发送端,发送端如果不指定端口的话,会随机分配一个。
这里我指定了10583,结果会打印出
127.0.0.1:wo shi yi ge shu zu:10583

DatagramPacket dp = new DatagramPacket(buf, buf.length,
                                        InetAddress.getByName("127.0.0.1"), 10000);//这里的10000是指发送到接收端的端口号
而不是你认为的服务端的端口号。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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