黑马程序员技术交流社区
标题:
网络Udp编程的问题?
[打印本页]
作者:
铿锵科技
时间:
2013-2-13 20:03
标题:
网络Udp编程的问题?
本帖最后由 铿锵科技 于 2013-2-19 20:41 编辑
有一个Udp接收信息的类
import java.net.*;
public class UdpRec {
public static void main(String[] args) throws Exception
{
//创建UDP Scocket 建立端点
DatagramSocket dSocket=new DatagramSocket(10000);//这个接收端口为10000
//定义缓冲区用于存储接收的数据
byte[] buf=new byte[1024];
//定义数据包
DatagramPacket dPacket=new DatagramPacket(buf, buf.length);
//将接收到的数据存入包中
dSocket.receive(dPacket);
//拆包:通过数据包的方法获取数据
String ip=dPacket.getAddress().getHostAddress();
String data=new String(dPacket.getData(),0,dPacket.getLength());
int port=dPacket.getPort();
System.out.println(ip+":"+port+"::"+data);
dSocket.close();
}
}
另一个Udp发送端类
import java.net.*;
public class UdpSend {
public static void main(String[] args) throws Exception {
// 创建UDP服务对象
DatagramSocket dSocket = new DatagramSocket(8888);//这个发送端口为8888
// 确定数据
byte[] buf = "UDP 哥们来了".getBytes();
// 数据封包
DatagramPacket dPacket = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.1.108"), 10000);
dSocket.send(dPacket);
// 关闭资源
dSocket.close();
}
}
为什么发送端的
DatagramSocket dSocket = new DatagramSocket(8888);//这个发送端口为8888
和
接收端的
DatagramSocket dSocket=new DatagramSocket(10000);//这个接收端口为10000
两个端口不一样也能收到消息?请高手详细解释!
作者:
朱玉玺
时间:
2013-2-13 20:58
InetAddress.getByName("192.168.1.108"), 10000);你这句定义了接受端的端口为10000,
作者:
逍林游
时间:
2013-2-14 10:01
你在自己本机测试这两个程序,这两个端口当然不能一样啊,一样了会报端口被占用的错。
作者:
陈科宇
时间:
2013-2-14 14:26
呵呵,其实这是你理解上的偏差。发送端的端口是不需要和接收端的端口一致的。
你的DatagramSocket dSocket = new DatagramSocket(8888)表示该socket与本机的8888端口绑定。当你的服务器端向客户端发送数据时才需要这个端口。
InetAddress.getByName("192.168.1.108"), 10000)指定的是接收端的IP地址和接收端口。而你在服务器端也已经定义好了10000端口接收数据,是不会出问题的。
作者:
顾传文
时间:
2013-2-18 16:22
端口又叫逻辑端口,是用来区别网络应用程序的。发送端和接收端是两个彼此独立的网络应用程序,分别运行在两个进程中。如果都使用相同的端口,就会出现端口冲突。
作者:
胥文
时间:
2013-2-18 17:20
毕老师说过发送和接受的端口一样才能收到
你确定端口不一样还能收到
作者:
黄基焜
时间:
2013-2-18 19:37
本帖最后由 黄基焜 于 2013-2-18 19:53 编辑
楼上的,请分清楚一个概念:
在UDP里面没有具体的细分接收端和发送端,DatagramSocket是即可以用来做接收端也可以用来做发送端;
不像TCP,细分了客户端Socket和服务端ServerSocket,TCP是要两端连接后才能发数据,所以在对象建立的时候就要确定好对方的IP地址和端口;
而UDP,不用建立连接就可以发送数据,所以直接把IP地址放到了数据包对象里面,就好像你QQ聊天不管对方在不在线,只要直接发送到对方QQ上一样。
发送端本身的端口:定义在DatagramSocket对象里面,是用来接收数据用的;
发送端的目的端口:定义在DatagramPacket对象里面,代表发送到那个IP地址的哪个端口
是不是一样的
作者:
寇弘禄
时间:
2013-2-18 23:07
UDP数据要发送到什么端口是在DatagramPacket()中定义的,
作者:
马铿
时间:
2013-2-19 12:01
发送端和接收端不一定要端口一致,但是发送端必须指定接收端的端口。
老毕说过:ip地址就是黑马训练营的地址,端口就是具体班级号。
发送端必须指定接收端的端口。
否则发送端不知道往哪个端口上发送数据,就好比来到黑马大楼了不知道具体班级号,你进哪个房间?一个道理!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2