黑马程序员技术交流社区

标题: 有谁明白这个类DatagramSocketImpl [打印本页]

作者: QQ被盗    时间: 2013-12-6 11:52
标题: 有谁明白这个类DatagramSocketImpl
急啊,不弄明白,死不瞑目啊,有谁知道这个DatagramSocketImpl中的receive()方法是被哪个实现了,怎么我找了这么久的源码,都没看到它被实现了
  1. protected abstract void receive(DatagramPacket p) throws IOException;
复制代码




作者: QQ被盗    时间: 2013-12-6 12:09
我算是死的瞑目了,找了这么久的源码终于找答案了,结果到了最后竟然跟我来一个native的方法

先查到这个类
  1. abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
复制代码
在看到这个类中的方法receive0
  1. protected synchronized void receive(DatagramPacket p)
  2.         throws IOException {
  3.         receive0(p);
  4.     }
复制代码
操,有时一个抽象的方法

  1. protected abstract void receive0(DatagramPacket p)
  2.         throws IOException;
复制代码

接着继续,查到这个类
  1. class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
复制代码
在这个类中又要查socketReceiveOrPeekData方法
  1. protected synchronized void receive0(DatagramPacket p) throws IOException {
  2.         int nativefd = checkAndReturnNativeFD();

  3.         if (p == null)
  4.             throw new NullPointerException("packet");
  5.         if (p.getData() == null)
  6.             throw new NullPointerException("packet buffer");

  7.         socketReceiveOrPeekData(nativefd, p, timeout, connected, false /*receive*/);
  8.     }
复制代码



结果一看,竟然是一个nativ方法
  1. private static native int socketReceiveOrPeekData(int fd, DatagramPacket packet,
  2.         int timeout, boolean connected, boolean peek) throws IOException;
复制代码

让我郁闷至死,至死都没弄明白是receive方法是怎么接收send方法发送的数据包







作者: ysunday    时间: 2013-12-7 01:27
少年,找到就行了,关键字最好和谐下啊
作者: 吴琼cola    时间: 2013-12-7 09:42
研究源码对自己写代码有特别好的帮助,代码之路就是copy,慢慢形成自己的自主思想,写出自己风格思想的代码。如果你用IDE(如:eclipse),你可以用快捷键去追踪(Ctrl+G,ctrl+shift+I)。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2