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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗全涛 黑马帝   /  2012-1-1 09:51  /  1904 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗全涛 于 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对象,可是抽象类不是无法创建实例,必须由其
子类继承后,才能创建对象吗?希望高手帮我看看。

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

4 个回复

倒序浏览
      Socket本身就有读写的功能,我也没有查看它的源码,不知道它是不是用匿名内类实现的,但肯定一点的是,既然它自身有读写功能,那肯定是自身内部已经实现了输入输出流,也就是你在外部可以直接用getOutputStream()或getInputStream()来获取它们的对象,至于这些方法的实现细节,它封装了,但原理应该是我上面所讲的:Socket内部自己实现了这些抽象类,在外部直接面向对象操作即可!

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
为梦而战 发表于 2012-1-1 11:34
Socket本身就有读写的功能,我也没有查看它的源码,不知道它是不是用匿名内类实现的,但肯定一点的是 ...

恩,想通了socket内部实现了输入输出流,并且这个输入输出流是InputStream的子类或者是OutputStream的子类。那么定义抽象类变量,将子类对象付给它们就好了。谢谢了。
回复 使用道具 举报
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;
    }

评分

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

查看全部评分

回复 使用道具 举报
罗全涛 发表于 2012-1-1 14:49
恩,想通了socket内部实现了输入输出流,并且这个输入输出流是InputStream的子类或者是OutputStream的子 ...

:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马