udp 发送数据时如何指定发送端口

jadic 2009-12-31 09:48:56
我查了下DatagramSocket的api帮助中好像没有说明怎么指定发送端口的
DatagramSocket(int port)和bind(SocketAddress addr) 都是指定接收端口的吧,
(示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket)
现在我想发送udp数据时,怎么让接收方看到的udp端口号是指定的端口好,请指点下,谢谢
...全文
1364 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadic 2010-01-08
  • 打赏
  • 举报
回复
是我搞错了,那天测试的软件显示端口号的有误,是绑定就可以了,结贴
dengsf 2010-01-04
  • 打赏
  • 举报
回复
bind 就是绑定本地端口了吧。
jadic 2010-01-04
  • 打赏
  • 举报
回复
再顶下啊
云上飞翔 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 jadic 的回复:]
我查了下DatagramSocket的api帮助中好像没有说明怎么指定发送端口的
DatagramSocket(int port)和bind(SocketAddress addr) 都是指定接收端口的吧,
(示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于:DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket)
现在我想发送udp数据时,怎么让接收方看到的udp端口号是指定的端口好,请指点下,谢谢
[/Quote]
楼主对网络程序设计不大熟悉。
DatagramSocket(int port)中port对于UDP,既是接收时监听的PORT,又是send(包)时用的发送的PORT。这是同一个啊。
dengsf 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jadic 的回复:]
bind是绑定本地端口,但是是监听端口,发送时不一定
[/Quote]

可以的,
写个程序测试一下即可。


import java.net.*;

class Test{
public static void main(String[] args) throws Exception{
if( args.length > 0 ){
System.out.println("to send");
send();
}else{
System.out.println("to recv");
recv();
}
}

public static void send() throws Exception{
DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress(8888));
byte[] b = new byte[100];
for(int i=0; i<b.length; i++){
b[i] = (byte)i;
}
DatagramPacket p = new DatagramPacket(b, 0, b.length, new InetSocketAddress("localhost", 9999));
s.send(p);
}

public static void recv() throws Exception{
DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress(9999));
byte[] b = new byte[100];
DatagramPacket p = new DatagramPacket(b, 0, b.length);
s.receive(p);
System.out.println(p.getAddress() + ":" + p.getPort() + " " + p.getLength());
}

};
jadic 2010-01-04
  • 打赏
  • 举报
回复
bind是绑定本地端口,但是是监听端口,发送时不一定

API文档:
(示例:
DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress(8888));
这等价于:
DatagramSocket s = new DatagramSocket(8888);
两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket
jadic 2010-01-01
  • 打赏
  • 举报
回复
在往上顶下,还请大侠指点啊
苍蝇①号 2009-12-31
  • 打赏
  • 举报
回复
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
APOLLO_TS 2009-12-31
  • 打赏
  • 举报
回复
广播发送,接受开启端口就能收。就跟收音机一样,开收音机就行,也不管来源。

我也没试验过。这个类用的领域不是太多。
jadic 2009-12-31
  • 打赏
  • 举报
回复
2楼的不对吧,下面是api说明
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

我现在是发送的时候不光要指定接收的udp端口,而且还要从本机指定的端口发出

62,614

社区成员

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

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