黑马程序员技术交流社区

标题: 网络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