socket 会自动断开吗?

judezhiyou 2004-10-20 11:50:29
socket双方在建立通信连接成功后会因为高负载而自动断开吗?请给出理由,或测试程序,谢谢。
...全文
216 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jb99334 2004-10-20
不会的
回复
adan520 2004-10-20
这个问题没有多大意义
回复
zhangblade 2004-10-20
不会,windows划窗机制会控制流量的。
回复
judeyouzhi 2004-10-20
是的,但没有查明是什么原因断掉。
microsoft公布的是说会引起server的不响应(hang),cpu占有率100%,但是好象没有这样的现象啊……
回复
alex6520 2004-10-20
不会自动断开
难道楼主遇到过自动断开的情形
回复
umit12020 2004-10-20
版主的知識真多﹐佩服
回复
judezhiyou 2004-10-20
我现在关心的是高负荷,因为我做过试验,证明了socket通信在双方闲置时候是不会断开的,6小时,24小时,28小时都不会,我想应该可以说明问题。
但是高负荷没有试验,征求各位试验方案?谢谢
回复
suspension 2004-10-20
不会自动断开

http://www.yourblog.org/Data/20042/10757.html

Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了。Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制。大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是“点到为止”,留给读者大量的想象空间。这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识。包含以下内容:
•什么是Socket
•它位于你的应用程序的哪些地方
•能正常运行的最简单的Socket例程――帮助你理解Java Socket的基础知识
•详细剖析另外两个探讨如何在多线程和具有连接池环境中使用套接字的示例
•简要讨论在现实世界中的一个Socket应用程序

如果你能够描述如何使用java.net这个包里的类,这份教程对你来说也许基础了一点。尽管它是一份提高技术的好资料,但是如果你已经在PC或者其他平台上有过长期Socket的开发经历,这部分提示也许会让你产生厌烦,但是如果你并不是很理解Socket,并且只想知道“什么是Socket”以及“怎么将Socket应用在自己的Java代码中”的话,这份教程则是一个很好的开始。

第二章:Socket基础

介绍

大多程序员,无论是否使用Java语言编程,都不希望知道太多关于不同的计算机之间相互通信的底层知识。程序员希望处理更容易理解的高层抽象。程序员更希望用他们熟悉的java的构造,通过直观接口与对象交互。
Socket存在于两个领域--我们宁愿处理抽象层而避免涉及底层细节,这一章所讲解的底层细节仅用于你理解抽象应用所必须的知识。

计算机组网
计算机之间用一种非常简单的方式来进行操作和通信。电脑芯片是一种开关,用1和0来储存和传输数据。当计算机希望共享数据时,它们需要所作的全部就是以相同的速度,相同的顺序,相同的时间等来回传输上百万的数据流。当你想在两个应用程序之间通信时,你怎么想考虑这些细节呢?
为了避免上面提到的事情,我们每次需要一组包协议用同样的方法来完成工作。这将使我们能够处理应用程序级的工作而不需要担心底层网络技术的细节。这样设置的包协议被称作“栈”。TCP/IP是最常见的协议栈。大部分协议栈(包括TCP/IP)都大致遵循ISO国际标准化组织的开放系统互连参考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM把计算机网络定义为7个逻辑层
很多公司对于这个模型的某些层的构造有过贡献。从产生电子信号()到给应用程序提供数据。TCP/IP映射到OSI模型的两层,如图所示。

我们不必过多的深入这些层的细节,但我们应该知道socket位于模型的什么位置。



Socket存在于哪些地方?
Socket大致位于OSI模型的会话层,会话层夹在面向应用的高层(上)的层和实时数据通信层(下)之间。会话层在两台计算机之间为管理和控制数据流提供服务。作为这一层的一部分,socket提供一个隐藏从传输线上获取bytes和bits的复杂性的抽象。换言之,socket允许我们让应用程序表示它想发送bytes。
socket隐藏了完成该工作的具体细节。




当你拿起电话说话时,电话把你的声音转换电信号。电话机是人和电信网络之间的接口。你不必知道你的声音是如何转换的细节,只需知道要你想和谁联系。同样的道理,socket隐藏了复杂的传输二进制数据而扮演高层接口的角色。

向一个应用程序曝光socket

当你在使用socket编写代码时,你的代码工作在表示层。表示层提供一个能让应用层使用的公共信息表示(representation of information)。假如你想把你的应用程序连接到CC银行系统而仅能使用EBCDIC。你的域对象(domain objects)用ASCII格式储存信息。既然这样,你得负责在表示层编写代码把EBCDIC的数据转换成ASCII格式,然后(比如)向应用层提供一个域对象(domain objects)。应用层可以用域对象(domain objects)做它想做的任何事情。





你编写的socket处理代码仅存在于表示层。应用层并不需要知道socket如何工作。
什么是socket?

现在我们知道了socket扮演的角色,那么剩下的问题就是:什么是socket?Bruce Eckel在他的《Java编程思想》一书中是这样描述socket的:

socket是一种用于表达两台机器之间连接“终端”的软件抽象。对于一个给定的连接,在每台机器上都有一个socket,你可以想象一个虚拟的"电缆"工作在两台机器之间,“电缆”插在两台机器的socket上。当然,物理硬件和两台机器之间的“电缆”这些连接装置都是未知的,抽象的所有目的就是为了让我们不必了解更多的细节。

简单的说,一台计算机上的socket同另一台计算机通话创建一个通信信道,程序员可以用这个信道在两台机器之间发送数据。当你发送数据时,TCP/IP协议栈的每一层都给你的数据里添加适当的报头。有个好消息是java语言隐藏了所有这些细节,这也是为什么他们有时被叫做“流socket”。
思考一下socket像电话听筒一样在电话的任意一端--你和我通过一个专门的信道来进行通话和接听。会话将一直进行下去直到我们决定挂断电话(除非我们使用蜂窝电话),除非我们挂断电话,否则我们各自的电话线路都会占线。
如果你需要在两台机器之间进行通讯而不使用高级机制像ORBs(以及CORBA, RMI, IIOP等等),socket比较适合你。Socket的底层机制则相当棘手。幸运的是,java平台给我们一些虽然简单但是相当强大的高层抽象以至于我们创建和使用socket更加容易一些。

socket的类型

一般而言,java socket有下面两种类型:

•TCP socket(由Socket类实现,下面的章节我们将对其讨论)
•UDP socket(由DatagramSocket类实现)

TCP和UDP扮演同样的角色,但是实现是不同的。两者都接收传输协议数据包并把它们传递到表示层。TCP把信息分解成数据包(datagrams)并在接收端重新组装起来。它还对丢失的数据包进行重新传输的请求。TCP减少了上层的担忧。UDP没有组装和重传请求的功能。它只是传输数据包。更高层的层必须确保信息的完整性以及组合顺序的正确性。

一般而言,UDP使你的应用程序更有效率,但只在你的应用程序并不是立即交流大量数据并且不需要组装大量的数据报而完成一条消息的时候。否则TCP才是最简单和最有效的选择。

因为大部分读者相对于UDP来说更喜欢用TCP一些,我们将我们的讨论限定在java语言中面向TCP类。
回复
Davelu 2004-10-20
不会的
回复
Lonelywolf1899 2004-10-20
不会的
回复
judezhiyou 2004-10-20
to adan520:
呵呵,一看我的调查就比你深入的多,经过查阅,已经在
http://support.microsoft.com/default.aspx?scid=kb;en-us;816960找到一些踪迹,正试图继续深入


希望有同样兴趣的朋友多给有用的意见。或者具体说明在什么情况下会出现……
回复
发动态
发帖子
windows网络管理与配置
创建于2007-08-02

6015

社区成员

windows网络管理与配置
申请成为版主
社区公告
暂无公告