当前位置:编程学习 > JAVA >>

【100分】Java UDP通信获取到的端口号的问题

 http://hnzhoujunmei.iteye.com/blog/784399
就跟这个例子中描述的一样。 我写的端口号1111 。为啥接收到的时候不是1111 呢?

package udp;  
  
import java.io.IOException;  
import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
import java.net.InetAddress;  
//可以使用双份该程序测试udp套接字  
public class UDP0 {  
    public static void main(String[] args) throws IOException {  
  
        byte[] arr = new byte[128];  
        DatagramPacket p = new DatagramPacket(arr,128);  
          
        if(args[0].charAt(0) == 'r'){//read  
            DatagramSocket sock = new DatagramSocket(1111);  
            sock.receive(p);  
            String word = new String(p.getData());   
              
            System.out.println("From: "+p.getAddress()+" :Port"+p.getPort());//取出数据包中的地址和端口,执行结果端口号不一致  
            System.out.println(word);  
            sock.close();  
        }  
        else{//write  
              
            DatagramSocket sock = new DatagramSocket();  
            p.setAddress(InetAddress.getByName(args[1])); //地址端口封装在数据包中  
            p.setPort(1111);   /// 我指定1111
            sock.send(p);  
            sock.close();  
        }  
    }  
}  

不知道是不是端口号的问题啊。 我局域网发数据收不到。  跟远程主机发送。远程主机可以收到 --------------------编程问答-------------------- 不知道是不是端口号的问题啊。 我局域网发数据收不到。  跟远程主机发送。远程主机可以收到 
------------------------------
猜测,UDP请求 被拦截了。 --------------------编程问答-------------------- 楼主先看API吧,每个函数的用途和功能,先了解清楚再说吧。

DatagramPacket.getPort() 返回的是远程主机的端口,不是本地端口。
套接字一般由4个部分组成,本地IP、本地端口、远程IIP、远程端口。

另外,发送代码中,没有看到设置数据的语句。 --------------------编程问答--------------------
引用 2 楼 preferme 的回复:
楼主先看API吧,每个函数的用途和功能,先了解清楚再说吧。

DatagramPacket.getPort() 返回的是远程主机的端口,不是本地端口。
套接字一般由4个部分组成,本地IP、本地端口、远程IIP、远程端口。

另外,发送代码中,没有看到设置数据的语句。


场景是这样的。我在远程服务器上部署一段代码 NAT

客户端A (port:10245) 发送数据给 NAT  获取到client-A的远程端口 60.114.32.x?远程地址:31563?
客户端B ......................clent-B........................

然后client-B会收到 NAT返回的 client-A的地址 60.114.32.x 和端口 31563

接着我发送数据给A  A就收不到了啊。。

Client-A Client-B和远程NAT之间收发数据正常。
Client-A Client-B是同一台终端。。。  

哥们可不帮忙分析一下原因啊

--------------------编程问答-------------------- 2L讲的还是蛮清楚的。
服务端的端口是不一定和客户端一样的,p.setPort(1111);这个操作可能导致发送UDP失败,除非服务端的端口与客户端一致。 --------------------编程问答-------------------- 创建数据报套接字并将其绑定到本地主机上的指定端口上应该没错。
你按照api上的说法试着调用checkListen 方法试下看行不行
如果存在安全管理器,则首先使用 port 参数作为参数调用其 checkListen 方法,以确保允许该操作。这可能会导致 SecurityException 异常。
--------------------编程问答-------------------- 3L 的过程在示例代码中没有展现出来,所以,不太明白LZ在干什么事情。

初一看,我以为是UDP打孔,后来一看,示例代码中没有相关的内容。

本地套接字的使用,要先向系统申请绑定操作的。
不太明白楼主的代码,是要多个进程绑定一个本地套接字,
还是一个进程使用一个套接字,既接收又发送数据。

网络编程,首先要明白套接字的概念,以及数据报文的概念,尤其是程序实现方面的理解而非理论知识。 --------------------编程问答-------------------- 如果传输消息,就涉及到两台主机。不妨C/S架构,先确定哪个是服务端、哪个是客户端,然后,再进行通信。
--------------------编程问答--------------------
引用 6 楼 preferme 的回复:
3L 的过程在示例代码中没有展现出来,所以,不太明白LZ在干什么事情。

初一看,我以为是UDP打孔,后来一看,示例代码中没有相关的内容。

本地套接字的使用,要先向系统申请绑定操作的。
不太明白楼主的代码,是要多个进程绑定一个本地套接字,
还是一个进程使用一个套接字,既接收又发送数据。

网络编程,首先要明白套接字的概念,以及数据报文的概念,尤其是程序实现方面的理解而非理论知识。


帖子中的实例确实没相关内容只是说同一个问题就是 ip的端口号不一致。

我想搞android上的语音通话啊。 头都大了。 哥们可不可以留个站内的联系方式呀。
我把代码发给你,帮我看看呗
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,