几个关于网络通信、编程的疑问,真正懂网络的请进

程猿薇茑
Java领域优质创作者
博客专家认证
2015-01-17 10:28:16
1.URL类的openConnection()和openStream() 到底有啥区别?用URLConnection的getInputStream() 方法不是多此一举吗,和直接用URL的openConnection()?

2.关于Socket链接通信的问题。
客户端和服务器端连接完成后各自一方都拥有一个Socket对象,这两个Socket关系是什么?
一方的人(比如客户端吧)可以获取自己这边Socket对象的inputStream和outputStream,另一方也是如此。
那么一方的人通过outputStream向自己这边Socket写入东西,自己是否可以通过inputStream读取自己这边Socket的数据呢?程序怎么就能判断从流中读取的数据是自己写入的还是对方写入的?凭什么我这边Write进去的就被你Read了,你那边write进去的我这边正好能read到?怎么保证这种传输机制的?
...全文
696 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
可乐罐 2015-02-05
  • 打赏
  • 举报
回复
第一个问题,举个手机打电话的例子,openConnection是拨号,openInputStream是听到对方的语音。如果拨号不成功,说明电话没有被电话链路接通,是不可能听到对方的语音的。这不是多此一举,而是必须的。因为,拨号不成功还有有很多原因的,比如占线、不在服务区啥的
JPF1024 2015-02-04
  • 打赏
  • 举报
回复
第一个问题,你可以这样理解,两个人约定在某个地方见面,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() 方法可以释放与此实例相关的网络资源,除非特定的协议规范为其指定了其他行为。 希望可以帮到你。
skgary 2015-02-04
  • 打赏
  • 举报
回复
引用 14 楼 zgjzc 的回复:
我先MARK下,待会来回答,LZ先别听楼上其他人的,都不对。
至少 ,10楼说的是正确的。
唐三角 2015-02-04
  • 打赏
  • 举报
回复
楼主关于socket的问题,还是看看tcp/ip 的相关文档吧。 然后也可以参考下linux下的socket的实现(虽然也是视作文件,但是有一定的特殊性)。
高境 2015-02-02
  • 打赏
  • 举报
回复
我先MARK下,待会来回答,LZ先别听楼上其他人的,都不对。
程猿薇茑 2015-01-31
  • 打赏
  • 举报
回复
引用 11 楼 gotopause 的回复:
问题1:我觉得你看一下API上面的描述可以得到你的答案!具体我也不知道
你们都是看英文的jdk文档吗?1.7的
程猿薇茑 2015-01-27
  • 打赏
  • 举报
回复
引用 7 楼 chouy 的回复:
第一个问题: 人家就是多提供一个接口,并不管方法是否重复。根据自己需要选用。 第二个问题: 每个SOCKET都有发送缓冲和接收缓冲,发送缓冲是自己写时用的,接收缓冲是自己读时用的。这样保证自己写的不会被读到。 你本地的发送缓冲数据通过网络到对方后,会放在接收缓冲里,反之亦然。
URL的openStream()也是调用的自身的URLConnection的getInputStream()方法。 URL的协议处理器的确是封装了socket
gotopause 2015-01-27
  • 打赏
  • 举报
回复
问题1:我觉得你看一下API上面的描述可以得到你的答案!具体我也不知道
gotopause 2015-01-27
  • 打赏
  • 举报
回复
问题2:双方连接建立以后相当于有一根水管把两台电脑连接了,双方的socket是水管的两头,一边灌水另外一边就会出水! 基本上是这个情况!
程猿薇茑 2015-01-21
  • 打赏
  • 举报
回复
引用 3 楼 u011630315 的回复:
第二个问题同求
第一个问题你懂?
商科程序员 2015-01-21
  • 打赏
  • 举报
回复
第一个问题: 人家就是多提供一个接口,并不管方法是否重复。根据自己需要选用。 第二个问题: 每个SOCKET都有发送缓冲和接收缓冲,发送缓冲是自己写时用的,接收缓冲是自己读时用的。这样保证自己写的不会被读到。 你本地的发送缓冲数据通过网络到对方后,会放在接收缓冲里,反之亦然。
程猿薇茑 2015-01-20
  • 打赏
  • 举报
回复
3楼的第一个问题懂?
使用socket通信还得注意异步发送消息啊,要不然双方都阻塞等待对方的数据。

lsongiu86 2015-01-19
  • 打赏
  • 举报
回复
第一个问题不懂,第二个问题可以说说。java里的socket用的tcp协议,但是tcp的底层也是udp交互的,两个socket交互的时候,每个都会在本地监听一个端口,发消息其实就是向对方的那个端口发送udp的包,但是udp本身是不安全的,无法判定对方是否接到消息,也无法判定是否丢包,但是tcp底层做了验证,通过握手机制保证了消息的安全性和完整性。这边的写入,其实是像对方的那个端口发包,不必纠结于两个socket的关系
南看台的骄傲 2015-01-19
  • 打赏
  • 举报
回复
第二个问题同求
程猿薇茑 2015-01-17
  • 打赏
  • 举报
回复
补充:URL类的openConnection()和openStream()底层怎么通信的,是否也是用socket?
程猿薇茑 2015-01-17
  • 打赏
  • 举报
回复
求顶啊!呵呵呵

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧