解决方案 »

  1.   

    补充:URL类的openConnection()和openStream()底层怎么通信的,是否也是用socket?
      

  2.   

    第一个问题不懂,第二个问题可以说说。java里的socket用的tcp协议,但是tcp的底层也是udp交互的,两个socket交互的时候,每个都会在本地监听一个端口,发消息其实就是向对方的那个端口发送udp的包,但是udp本身是不安全的,无法判定对方是否接到消息,也无法判定是否丢包,但是tcp底层做了验证,通过握手机制保证了消息的安全性和完整性。这边的写入,其实是像对方的那个端口发包,不必纠结于两个socket的关系
      

  3.   

    3楼的第一个问题懂?
    使用socket通信还得注意异步发送消息啊,要不然双方都阻塞等待对方的数据。
      

  4.   

    第一个问题:
    人家就是多提供一个接口,并不管方法是否重复。根据自己需要选用。
    第二个问题:
    每个SOCKET都有发送缓冲和接收缓冲,发送缓冲是自己写时用的,接收缓冲是自己读时用的。这样保证自己写的不会被读到。
    你本地的发送缓冲数据通过网络到对方后,会放在接收缓冲里,反之亦然。
      

  5.   

    URL的openStream()也是调用的自身的URLConnection的getInputStream()方法。
    URL的协议处理器的确是封装了socket
      

  6.   

    问题2:双方连接建立以后相当于有一根水管把两台电脑连接了,双方的socket是水管的两头,一边灌水另外一边就会出水!
    基本上是这个情况!
      

  7.   

    问题1:我觉得你看一下API上面的描述可以得到你的答案!具体我也不知道
      

  8.   

    你们都是看英文的jdk文档吗?1.7的
      

  9.   

    我先MARK下,待会来回答,LZ先别听楼上其他人的,都不对。
      

  10.   

    楼主关于socket的问题,还是看看tcp/ip 的相关文档吧。
    然后也可以参考下linux下的socket的实现(虽然也是视作文件,但是有一定的特殊性)。
      

  11.   

    第一个问题,你可以这样理解,两个人约定在某个地方见面,openConnection()代表的就是两个人都到某个地方了,openStream()就是说我准备好了,而getInputStream()接收另外一个人的东西了。其实第二个问题和第一个问题有很相似的地方,关于tcp和udp你可以百度了解下,我只记得一个是不管"另外一个"是不是在线都会发消息,另外一个(可能是udp)则是必须"在线"才能发送消息.
    关于第一个问题,你可以参考jdk 1.6的中文文档,我摘了一部分,如下:
    抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:openConnection() connect()
    对影响到远程资源连接的参数进行操作。 与资源交互;查询头字段和内容。 ----------------------------> 
    时间
    通过在 URL 上调用 openConnection 方法创建连接对象。
    处理设置参数和一般请求属性。
    使用 connect 方法建立到远程对象的实际连接。
    远程对象变为可用。远程对象的头字段和内容变为可访问。
    使用以下方法修改设置参数:setAllowUserInteraction
    setDoInput
    setDoOutput
    setIfModifiedSince
    setUseCaches
    使用以下方法修改一般请求属性:setRequestProperty
    使用 setDefaultAllowUserInteraction 和 setDefaultUseCaches 可设置 AllowUserInteraction 和 UseCaches 参数的默认值。上面每个 set 方法都有一个用于获取参数值或一般请求属性值的对应 get 方法。适用的具体参数和一般请求属性取决于协议。在建立到远程对象的连接后,以下方法用于访问头字段和内容:getContent
    getHeaderField
    getInputStream
    getOutputStream
    某些头字段需要经常访问。以下方法:getContentEncoding
    getContentLength
    getContentType
    getDate
    getExpiration
    getLastModifed
    提供对这些字段的便捷访问。getContent 方法使用 getContentType 方法以确定远程对象类型;子类重写 getContentType 方法很容易。一般情况下,所有的预连接参数和一般请求属性都可忽略:预连接参数和一般请求属性默认为敏感值。对于此接口的大多数客户端而言,只有两个需要的方法:getInputStream 和 getContent,它们通过便捷方法镜像到 URL 类中。有关 http 连接的请求属性和头字段的更多信息,可从以下位置找到: http://www.ietf.org/rfc/rfc2068.txt
     
    有关 fileNameMap 的注意事项:在 JDK 1.1.6 以前的版本中, URLConnection 的 fileNameMap 字段是公共的。在 JDK 1.1.6 及以后的版本中, fileNameMap 字段是私有的;对其添加了 accessor 方法和 mutator 方法 getFileNameMap 及 setFileNameMap 以便访问。 Compatibility 页中也对此更改进行了介绍。 完成请求后,在一个 URLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例相关的网络资源,除非特定的协议规范为其指定了其他行为。希望可以帮到你。