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

-droidcoffee- 2013-06-20 05:06:09
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();
}
}
}

不知道是不是端口号的问题啊。 我局域网发数据收不到。 跟远程主机发送。远程主机可以收到
...全文
490 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2013-06-21
  • 打赏
  • 举报
回复
如果传输消息,就涉及到两台主机。不妨C/S架构,先确定哪个是服务端、哪个是客户端,然后,再进行通信。
冰思雨 2013-06-21
  • 打赏
  • 举报
回复
3L 的过程在示例代码中没有展现出来,所以,不太明白LZ在干什么事情。 初一看,我以为是UDP打孔,后来一看,示例代码中没有相关的内容。 本地套接字的使用,要先向系统申请绑定操作的。 不太明白楼主的代码,是要多个进程绑定一个本地套接字, 还是一个进程使用一个套接字,既接收又发送数据。 网络编程,首先要明白套接字的概念,以及数据报文的概念,尤其是程序实现方面的理解而非理论知识。
-droidcoffee- 2013-06-21
  • 打赏
  • 举报
回复
引用 6 楼 preferme 的回复:
3L 的过程在示例代码中没有展现出来,所以,不太明白LZ在干什么事情。 初一看,我以为是UDP打孔,后来一看,示例代码中没有相关的内容。 本地套接字的使用,要先向系统申请绑定操作的。 不太明白楼主的代码,是要多个进程绑定一个本地套接字, 还是一个进程使用一个套接字,既接收又发送数据。 网络编程,首先要明白套接字的概念,以及数据报文的概念,尤其是程序实现方面的理解而非理论知识。
帖子中的实例确实没相关内容只是说同一个问题就是 ip的端口号不一致。 我想搞android上的语音通话啊。 头都大了。 哥们可不可以留个站内的联系方式呀。 我把代码发给你,帮我看看呗
地下室森林 2013-06-20
  • 打赏
  • 举报
回复
创建数据报套接字并将其绑定到本地主机上的指定端口上应该没错。 你按照api上的说法试着调用checkListen 方法试下看行不行
如果存在安全管理器,则首先使用 port 参数作为参数调用其 checkListen 方法,以确保允许该操作。这可能会导致 SecurityException 异常。
oh_Maxy 2013-06-20
  • 打赏
  • 举报
回复
2L讲的还是蛮清楚的。 服务端的端口是不一定和客户端一样的,p.setPort(1111);这个操作可能导致发送UDP失败,除非服务端的端口与客户端一致。
-droidcoffee- 2013-06-20
  • 打赏
  • 举报
回复
引用 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是同一台终端。。。 哥们可不帮忙分析一下原因啊
冰思雨 2013-06-20
  • 打赏
  • 举报
回复
楼主先看API吧,每个函数的用途和功能,先了解清楚再说吧。 DatagramPacket.getPort() 返回的是远程主机的端口,不是本地端口。 套接字一般由4个部分组成,本地IP、本地端口、远程IIP、远程端口。 另外,发送代码中,没有看到设置数据的语句。
想喝咖啡的貓 2013-06-20
  • 打赏
  • 举报
回复
不知道是不是端口号的问题啊。 我局域网发数据收不到。 跟远程主机发送。远程主机可以收到 ------------------------------ 猜测,UDP请求 被拦截了。

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧