Java socket编程入门[1]

1/5/2008来源:Java教程人气:7978

本教程由IBM DevelopWorks提供,版权归IBM所有


原作:Roy Miller   翻译:Robinh00d[CSTC]

翻译本文的目的仅仅是为了练习,本教程版权归IBM所有,本人不对其拥有版权

第一章:学习提示

我适合学习这份教程吗

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

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

第二章:Socket基础

介绍

大多程序员,无论是否使用Java语言编程,都不希望知道太多关于不同的计算机之间相互通信的底层知识。程序员希望处理更容桌斫獾母卟愠橄蟆3绦蛟备M盟鞘煜膉ava的构造,通过直观接口与对象交互。
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?