A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 铿锵科技 中级黑马   /  2013-2-13 20:03  /  1890 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 铿锵科技 于 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
两个端口不一样也能收到消息?请高手详细解释!


8 个回复

正序浏览
马铿 中级黑马 2013-2-19 12:01:07
9#
发送端和接收端不一定要端口一致,但是发送端必须指定接收端的端口。
老毕说过:ip地址就是黑马训练营的地址,端口就是具体班级号。
发送端必须指定接收端的端口。
否则发送端不知道往哪个端口上发送数据,就好比来到黑马大楼了不知道具体班级号,你进哪个房间?一个道理!

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
UDP数据要发送到什么端口是在DatagramPacket()中定义的,
回复 使用道具 举报
本帖最后由 黄基焜 于 2013-2-18 19:53 编辑

楼上的,请分清楚一个概念:
在UDP里面没有具体的细分接收端和发送端,DatagramSocket是即可以用来做接收端也可以用来做发送端;
不像TCP,细分了客户端Socket和服务端ServerSocket,TCP是要两端连接后才能发数据,所以在对象建立的时候就要确定好对方的IP地址和端口;
而UDP,不用建立连接就可以发送数据,所以直接把IP地址放到了数据包对象里面,就好像你QQ聊天不管对方在不在线,只要直接发送到对方QQ上一样。
发送端本身的端口:定义在DatagramSocket对象里面,是用来接收数据用的;
发送端的目的端口:定义在DatagramPacket对象里面,代表发送到那个IP地址的哪个端口
是不是一样的

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
毕老师说过发送和接受的端口一样才能收到
你确定端口不一样还能收到
回复 使用道具 举报
端口又叫逻辑端口,是用来区别网络应用程序的。发送端和接收端是两个彼此独立的网络应用程序,分别运行在两个进程中。如果都使用相同的端口,就会出现端口冲突。
回复 使用道具 举报
呵呵,其实这是你理解上的偏差。发送端的端口是不需要和接收端的端口一致的。
你的DatagramSocket dSocket = new DatagramSocket(8888)表示该socket与本机的8888端口绑定。当你的服务器端向客户端发送数据时才需要这个端口。
InetAddress.getByName("192.168.1.108"), 10000)指定的是接收端的IP地址和接收端口。而你在服务器端也已经定义好了10000端口接收数据,是不会出问题的。

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1

查看全部评分

回复 使用道具 举报
你在自己本机测试这两个程序,这两个端口当然不能一样啊,一样了会报端口被占用的错。
回复 使用道具 举报
InetAddress.getByName("192.168.1.108"), 10000);你这句定义了接受端的端口为10000,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马