public void activeSend(SocketAddress addr, byte[] data) throws Exception {
DatagramPacket pack = new DatagramPacket(data, data.length, addr);
activeDatagramSocket.send(pack);
System.out.println("use active send");
}如果这样发送的话  最终会从本地的一个 默认端口(操作系统帮你指定一个出端口) 出去到达对方IP但我现在要指定端口,必须从3030出去.
也就是如果要写一个p2p打洞程序的必须操作: 指定确切的可行方向上的  '洞'java如何指定出端口?

解决方案 »

  1.   

    SocketAddress是一个抽象类。
    public class InetSocketAddress extends SocketAddress
    InetSocketAddress 继承了SocketAddress。
    InetSocketAddress(InetAddress addr, int port) 构造函数就可以指定端口。
      

  2.   

    UDP?
    获得这个activeDatagramSocket的时候用下面的构造方法:
    DatagramSocket(int port) 
              创建数据报套接字并将其绑定到本地主机上的指定端口。
      

  3.   

    楼上几位...出端口 和 入端口的概念先搞明白成吗?计算机 的port 分为出端口和入端口.你建立 一个 socket server 侦听 8080端口.  随时准备接收其他人的消息. 这个时候 你这个8080叫做入端口.而别人的IE去访问 你的8080端口是需要从自己的计算机的 xxxx 端口走出去从而到达你的 8080端口如下:192.168.0.111:2212  --->  192.168.0.2:8080而现在.你们说的都是后面的8080;  这个我还不会?  那我不找块豆腐撞死得了么
      

  4.   

    用这个连服务器:
    Socket(String host, int port, InetAddress localAddr, int localPort) 
      

  5.   


    是你没有搞明白吗?如果不清楚,去看看网络基础吧。
    看看网络编程是怎么绑定本地IP和端口的。给你一个JAVDDOC参考一下。public void bind(SocketAddress bindpoint)
              throws IOException将套接字绑定到本地地址。 
    如果地址为 null,则系统将挑选一个临时端口和一个有效本地地址来绑定套接字。 
    参数:
    bindpoint - 要绑定到的 SocketAddress 
    抛出: 
    IOException - 如果绑定操作失败或者已经绑定了套接字。 
    IllegalArgumentException - 如果 bindpoint 是不受此套接字支持的 SocketAddress 子类。
    从以下版本开始: 
    1.4 
    另请参见:
    isBound()java.net 
    类 DatagramSocket
    java.lang.Object
      java.net.DatagramSocket
    直接已知子类: 
    MulticastSocket --------------------------------------------------------------------------------public class DatagramSocketextends Object此类表示用来发送和接收数据报包的套接字。 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。 示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。 从以下版本开始: 
    JDK1.0 
    另请参见:
    DatagramPacket, DatagramChannel顺便你可以找个豆腐撞了。
      

  6.   


    你认为如果你不指定端口,[C]lient -> [S]erver,难道只有S方才会有端口吗?C方难道不会产生随机端口吗???
      

  7.   

    巨汗......我都已经明确表示了 :我需要的不是随机端口了......  而是指定端口,  我都明确表达了拒绝随机....  你居然还能发出这样的回复来!!!!!!!!!!!!!!!!!!!!!我再把问题给你发一次:
    ----------------------------------
    如果这样发送的话 最终会从本地的一个 默认端口(操作系统帮你指定一个出端口) 出去到达对方IP但我现在要指定端口,必须从3030出去.
    也就是如果要写一个p2p打洞程序的必须操作: 指定确切的可行方向上的 '洞'java如何指定出端口?
    ----------------------------------fainfy  我不想在这里骂人... 但你的2次回复真有点让我想骂人...
    真的.如果你会认真看别人在说什么的话.
      

  8.   

    用Socket套接字制定端口
    ServerSocket
      

  9.   

    DatagramPacket pack = new DatagramPacket(data, data.length, addr);
    activeDatagramSocket.send(pack);
    System.out.println("use active send");DatagramPacket是无法直接绑定本地IP和端口的。
    DatagramPacket的数据是通过DatagramSocket.send出去的。
    要绑定本地的端口和IP只需要调用。
    activeDatagramSocket.bind(SocketAddress addr);
    这里的SocketAddress就是我1楼的回复。顺便在发一个JAVADOC给你。
    JDK6 JavaDoc:http://download.csdn.net/detail/fainfy/3689670
    JDK7 JavaDoc: http://download.csdn.net/detail/fainfy/3605021顺便我的回复是按照楼主的代码来回复的,我认为没有问题,只是你没有明白而已。
    如果提问者是一个有心人,我会直接贴上可用的代码。
      

  10.   


    还是让你自己来决定是你更2还是我更2吧。DatagramSocket socket = new DatagramSocket();
    SocketAddress addr = new InetSocketAddress(InetAddress.getLocalHost(), 3030);
    socket.bind(addr);你认为上面的代码会产生随机端口吗?
    告诉你吧下面的代码才会产生随机端口。DatagramSocket socket = new DatagramSocket();
    SocketAddress addr = new InetSocketAddress(InetAddress.getLocalHost(), 0);
    socket.bind(addr);
    世界真是无奇不有,不装装懂,不是装B你认为是什么?
      

  11.   


    我可是用心回复的哟,明确的指出JDK API的描述以及实例,只是楼主一相情愿的认为而已。
      

  12.   

    你说的这个都没用.  
    party哪一点不是在批评你与指责你并且盘剥你?
    但是他们却自己丧尽天良. 难道你还要认为他们是所谓的[正直诚实]的吗?以此类推, 很多人虽然没有那么的大恶,但是同样的也是居心不良而不是你所说的:[正直诚实]当然真正善的[正直诚实]也是大把大把的. 只是,上面那个最先语出不敬的人至少不是这样. 我想你自己能判断他的[善]和[恶]  --  至少他在我这个帖子的回复里面都是不那么[善]的.所以对待不那么[善]的行为.我没必要[惯]着他.----
    回到技术上来他最先的回复  new InetSocketAddress(host, port); 是个错的. 他给的那几行代码只能表示是连接到对方server端.
    反而你给我回复的DatagramPacket(port)是对的. 但是刚开始我不知道原来这么简单.而且JDK的说明生涩难懂; -- 这也是后来我自己通过抓包软件测试才明白的.然后之后他对我发出不敬的言辞.  于是事情就是这样.
      

  13.   

    楼主真乃一朵奇葩,自己不懂还先态度坏,别人早就回答你了,回到娘胎里去把修养练好点再出来发帖吧。
    连bind都不懂,还写什么网络编程
      

  14.   

    楼上几位...出端口 和 入端口的概念先搞明白成吗?计算机 的port 分为出端口和入端口.----------------------------------------------------
    先看看自己的言辞。这是请教别人问题的态度么?
      

  15.   


    不想和楼主争一些无聊的事情。
    1.他最先的回复 new InetSocketAddress(host, port); 是个错的. 他给的那几行代码只能表示是连接到对方server端.
    回复:不懂不要瞎说,下面我给你上一个JDK内置的源码。/**
         * Constructs a datagram socket and binds it to the specified port
         * on the local host machine.  The socket will be bound to the wildcard
         * address, an IP address chosen by the kernel.
         * 
         * <p>If there is a security manager, 
         * its <code>checkListen</code> method is first called
         * with the <code>port</code> argument
         * as its argument to ensure the operation is allowed. 
         * This could result in a SecurityException.
         *
         * @param      port port to use.
         * @exception  SocketException  if the socket could not be opened,
         *               or the socket could not bind to the specified local port.
         * @exception  SecurityException  if a security manager exists and its  
         *             <code>checkListen</code> method doesn't allow the operation.
         * 
         * @see SecurityManager#checkListen
         */
        public DatagramSocket(int port) throws SocketException {
    this(port, null);
        }    /**
         * Creates a datagram socket, bound to the specified local
         * address.  The local port must be between 0 and 65535 inclusive.
         * If the IP address is 0.0.0.0, the socket will be bound to the
         * wildcard address, an IP address chosen by the kernel.
         * 
         * <p>If there is a security manager, 
         * its <code>checkListen</code> method is first called
         * with the <code>port</code> argument
         * as its argument to ensure the operation is allowed. 
         * This could result in a SecurityException.
         * 
         * @param port local port to use
         * @param laddr local address to bind
         * 
         * @exception  SocketException  if the socket could not be opened,
         *               or the socket could not bind to the specified local port.
         * @exception  SecurityException  if a security manager exists and its  
         *             <code>checkListen</code> method doesn't allow the operation.
         * 
         * @see SecurityManager#checkListen
         * @since   JDK1.1
         */
        public DatagramSocket(int port, InetAddress laddr) throws SocketException {
    this(new InetSocketAddress(laddr, port));
        }this(new InetSocketAddress(laddr, port));看清楚这一行代码,是你自己不会用。请不要说我错了OK。2.反而你给我回复的DatagramPacket(port)是对的. 但是刚开始我不知道原来这么简单.
    回复:DatagramPacket还是DatagramSocket,不想回复,OK。3.而且JDK的说明生涩难懂; -- 这也是后来我自己通过抓包软件测试才明白的.
    回复:把饭放到你面前,还要人喂你才会吃吗?还是说你太笨了?4.谁先动火的大家自己心里都清楚。
    回复:见过贼喊捉贼的,没有见过论坛上面黑字、时间顺序、证据存在的贼喊捉贼的。呵呵,祝楼主好运。
      

  16.   

    3楼的代码错误.所引导的方向也是错误的.
    理由如下代码:
    SocketAddress server = new InetSocketAddress(host, port); //这个时候host 以及port是指server的 ip和端口
    DatagramPacket pack = new DatagramPacket(data, data.length, server);
    DatagramSocket ds = new DatagramSocket(3030); //真正正确设置出端口的地方在这
    ds.send(pack);  
    由以上可以很清晰的证明,3楼所诉完全错误.后续我的反驳是理所应当. 因为你连基本概念都没搞清楚,或者连我需求都没看清楚.
    至于你后面回复那是后话,至少在之前你的无礼是建立在错误的基础上的.
      -- 因为我自己也是通过自己查询JDK和反复抓包才明白的;
    如果要正确引导,只需要1行汉字外加一行代码即可.如下:
    //java提供了一个可以绑定出端口的方式;代码如下. 直接用ds进行.send的时候会自动分配3030为出端口
    DatagramSocket ds = new DatagramSocket(3030);于是就是这样.  具体什么情况你自己把3楼的代码多看一看. 然后看看本楼回复自然就很清楚了.
      

  17.   


    你要搞清楚,我回复的是SocketAddress,并没有告诉你要采用在这个构造函数上面(在你的世界中SocketAddress难道只是设置S的端口?不要太自以为是了,上面之所以还追加一个回复(带JDK源码),是想让你睁大眼睛看清楚,绑定就是我一楼所说的一样)。
    从开始我就希望使用bind方法绑定,当然刚开始我以为你明白点网络基本知识。
    我的无礼,搞笑吧。我不敢保证我的回答是一定正确的。但是至少我从未偏离主题,只是你一厢情愿的认为而已罢了(太自我的人就是这样吧,总是想为自己的无知找借口)。