黑马程序员技术交流社区

标题: 昨晚看到tcp编程中不懂的地方,求解决 [打印本页]

作者: 罗全涛    时间: 2012-1-1 09:51
标题: 昨晚看到tcp编程中不懂的地方,求解决
本帖最后由 罗全涛 于 2012-1-2 14:13 编辑

在tcp网络编程中,当创建了客户端套接字s后,可通过它的getInputStream()和getOutputStream()来获取网络字节输入输出流,
如下:
Socket s = new Socket("192.168.1.101",10003);
OutputStream out = s.getOutputStream();
InputStream in = s.getOutputStream();
函数原型附录如下,查阅于JAVA_API:
InputStream getInputStream()
          返回此套接字的输入流。
OutputStream getOutputStream()
          返回此套接字的输出流。
我思考着OutputStream 和 InputStream 都是abstract抽象类,上面的语句不就相当于
创建了OutputStream对象和InputStream对象,可是抽象类不是无法创建实例,必须由其
子类继承后,才能创建对象吗?希望高手帮我看看。
作者: 为梦而战    时间: 2012-1-1 11:34
      Socket本身就有读写的功能,我也没有查看它的源码,不知道它是不是用匿名内类实现的,但肯定一点的是,既然它自身有读写功能,那肯定是自身内部已经实现了输入输出流,也就是你在外部可以直接用getOutputStream()或getInputStream()来获取它们的对象,至于这些方法的实现细节,它封装了,但原理应该是我上面所讲的:Socket内部自己实现了这些抽象类,在外部直接面向对象操作即可!
作者: 罗全涛    时间: 2012-1-1 14:49
为梦而战 发表于 2012-1-1 11:34
Socket本身就有读写的功能,我也没有查看它的源码,不知道它是不是用匿名内类实现的,但肯定一点的是 ...

恩,想通了socket内部实现了输入输出流,并且这个输入输出流是InputStream的子类或者是OutputStream的子类。那么定义抽象类变量,将子类对象付给它们就好了。谢谢了。
作者: 刘小峰    时间: 2012-1-1 15:20
OutputStream out = s.getOutputStream();
InputStream in = s.getOutputStream();

我对这俩句话的理解是这样的:他是用套接字s的getOutputStream()和getOutputStream()方法
来调用Socket中的输入输出流对象,至于Socket内部是如何实现的,请看下面的代码:
这是Sorket类的部分关于getOutputStream()的源代码,希望能帮到你


public OutputStream getOutputStream() throws IOException {
        if (isClosed())
            throw new SocketException("Socket is closed");
        if (!isConnected())
            throw new SocketException("Socket is not connected");
        if (isOutputShutdown())
            throw new SocketException("Socket output is shutdown");
        final Socket s = this;
        OutputStream os = null;
        try {
                os = (OutputStream)
                AccessController.doPrivileged(new PrivilegedExceptionAction() {
                    public Object run() throws IOException {
                        return impl.getOutputStream();
                    }
                });
        } catch (java.security.PrivilegedActionException e) {
            throw (IOException) e.getException();
        }
        return os;
    }

作者: 为梦而战    时间: 2012-1-1 15:48
罗全涛 发表于 2012-1-1 14:49
恩,想通了socket内部实现了输入输出流,并且这个输入输出流是InputStream的子类或者是OutputStream的子 ...

:handshake




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