`

JAVA套接字(Socket)二 套接字基础

阅读更多
套接字(socket)为两台计算机之间的通信提供了一种机制,在 James Gosling 注意到 Java 语言之前,套接字就早已赫赫有名。该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字。多数着重讨论 Java 编码的书或者未涵盖这个主题,或者给读者留下很大的想象空间。本教程将告诉您开始在代码中有效地使用套接字时,您真正需要知道哪些知识。我们将专门讨论以下问题:
什么是套接字
它位于您可能要写的程序的什么地方
能工作的最简单的套接字实现 ― 以帮助您理解基础知识
详细剖析另外两个探讨如何在多线程和具有连接池环境中使用套接字的示例
简要讨论一个现实世界中的套接字应用程序
如果您能够描述如何使用 java.net 包中的类,那么本教程对您来说也许基础了点,虽然用它来提高一下还是不错的。如果您在 PC 和其它平台上使用套接字已经几年,那么最初的部分也许会使您觉得烦。但如果您不熟悉套接字,而且只是想知道什么是套接字以及如何在 Java 代码中有效地使用它们,那么本教程就是一个开始的好地方。

套接字基础
1. 介绍

多数程序员,不管他们是否使用 Java 语言进行编码,都不想很多知道关于不同计算机上的应用程序彼此间如何通信的低级细节。程序员们希望处理更容易理解的更高级抽象。Java 程序员希望能用他们熟悉的 Java 构造,通过直观接口与对象交互。
套接字在两个领域中都存在 ― 我们宁愿避开的低级细节和我们更愿处理的抽象层。本教程讨论的低级细节将只限于理解抽象应用程序所必须的部分。

2. 计算机组网 101
计算机以一种非常简单的方式进行相互间的操作和通信。计算机芯片是以 1 和 0 的形式存储并传输数据的开―闭转换器的集合。当计算机想共享数据时,它们所需做的全部就是以一致的速度、顺序、定时等等来回传输几百万比特和字节的数据流。每次想在两个应用程序之间进行信息通信时,您怎么会愿意担心那些细节呢?
为免除这些担心,我们需要每次都以相同方式完成该项工作的一组包协议。这将允许我们处理应用程序级的工作,而不必担心低级网络细节。这些成包协议称为协议栈(stack)。TCP/IP 是当今最常见的协议栈。多数协议栈(包括 TCP/IP)都大致对应于国际标准化组织(International Standards Organization,ISO)的开放系统互连参考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM 认为在一个可靠的计算机组网中有七个逻辑层(见图)。各个地方的公司都对这个模型某些层的实现做了一些贡献,从生成电子信号(光脉冲、射频等等)到提供数据给应用程序。TCP/IP 映射到 OSI 模型中的两层的情形如图所示。
我们不想涉及层的太多细节,但您应该知道套接字位于什么地方。



3. 套接字位于什么地方
套接字大致驻留在 OSI 模型的会话层(见图)。会话层夹在其上面向应用的层和其下的实时数据通信层之间。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。
当您打电话时,您的声音传到传感器,传感器把它转换成可以传输的电数据。电话机是人与电信网络的接口。您无须知道声音如何传输的细节,只要知道想打电话给谁就行了。同样地,套接字扮演隐藏在未知通道上传输 1 和 0 的复杂性的高级接口的角色。



4. 把套接字暴露给应用程序
使用套接字的代码工作于表示层。表示层提供应用层能够使用的信息的公共表示。假设您打算把应用程序连接到只能识别 EBCDIC 的旧的银行系统。应用程序的域对象以 ASCII 格式存储信息。在这种情况下,您得负责在表示层上编写把数据从 EBCDIC 转换成 ASCII 的代码,然后(比方说)给应用层提供域对象。应用层然后就可以用域对象来做它想做的任何事情。
您编写的套接字处理代码只存在于表示层中。您的应用层无须知道套接字如何工作的任何事情。



5. 什么是套接字?
既然我们已经知道套接字扮演的角色,那么剩下的问题是:什么是套接字?Bruce Eckel 在他的《Java 编程思想》一书中这样描述套接字:

套接字是一种软件抽象,用于表达两台机器之间的连接“终端”。对于一个给定的连接,每台机器上都有一个套接字,您也可以想象它们之间有一条虚拟的“电缆”,“电缆”的每一端都插入到套接字中。当然,机器之间的物理硬件和电缆连接都是完全未知的。抽象的全部目的是使我们无须知道不必知道的细节。
简言之,一台机器上的套接字与另一台机器上的套接字交谈就创建一条通信通道。程序员可以用该通道来在两台机器之间发送数据。当您发送数据时,TCP/IP 协议栈的每一层都会添加适当的报头信息来包装数据。这些报头帮助协议栈把您的数据送到目的地。好消息是 Java 语言通过"流"为您的代码提供数据,从而隐藏了所有这些细节,这也是为什么它们有时候被叫做流套接字(streaming socket)的原因。
把套接字想成两端电话上的听筒 ― 我和您通过专用通道在我们的电话听筒上讲话和聆听。直到我们决定挂断电话,对话才会结束(除非我们在使用蜂窝电话)。而且我们各自的电话线路都占线,直到我们挂断电话。
如果想在没有更高级机制如 ORB(以及 CORBA、RMI、IIOP 等等)开销的情况下进行两台计算机之间的通信,那么套接字就适合您。套接字的低级细节相当棘手。幸运的是,Java 平台给了您一些虽然简单但却强大的更高级抽象,使您可以容易地创建和使用套接字。

6. 套接字的类型
一般而言,Java 语言中的套接字有以下两种形式:
TCP 套接字(由 Socket 类实现,稍后我们将讨论这个类)
UDP 套接字(由 DatagramSocket 类实现)
TCP 和 UDP 扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。
一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。
因为多数读者都喜欢 TCP 胜过 UDP,所以我们将把讨论限制在 Java 语言中面向 TCP 的类。


ref:http://blog.csdn.net/m13666368773/article/details/7627132
  • 大小: 25.4 KB
  • 大小: 34.9 KB
分享到:
评论

相关推荐

    Socket套接字—Java套接字编程

    Socket套接字是Java编程语言中用于网络通信的核心组件,它是实现客户端-服务器模型的基础。在Java中,Socket和ServerSocket类提供了套接字编程的基本功能。本文将深入探讨Java套接字编程的相关知识点,包括Socket和...

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

    JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm

    socket 套接字 Java 套接字 编程

    Java套接字编程是网络通信的核心技术之一,主要...总的来说,Java套接字编程是构建网络应用的基础,理解其工作原理和使用方法对于开发分布式系统至关重要。通过不断实践和优化,我们可以构建高效、稳定的网络通信系统。

    基于Java的Socket套接字编程 源代码

    文件名“Socket套接字—Java套接字编程上1”可能暗示了这是一个系列教程的第一部分,涵盖了基础知识和简单的客户端-服务器交互。实际源码可能包括客户端如何发起连接、发送数据,以及服务器如何监听、接收数据和响应...

    java中socket套接字定义与使用

    总的来说,Java中的Socket套接字是实现网络通信的核心工具,无论是基于TCP的稳定传输还是UDP的高效传输,都能通过Socket灵活地构建网络应用。在实际开发中,开发者应根据应用的需求和场景选择合适的通信协议,以实现...

    Java套接字(socket)101

    我整理生成的CHM格式文件 Java套接字(socket)101 关于JAVA.NET包的SOCKET编程! 因为最近在搞这个所以整理了一些资料和大家分享 并非本人原创,郑重感谢原作者!

    Java 套接字编程Java 套接字编程

    ### Java套接字编程详解 #### 一、引言 随着互联网技术的不断发展与普及,网络编程成为现代软件开发中不可或缺的一部分。Java作为一种广泛应用的编程语言,提供了丰富的API支持网络编程,尤其是对于套接字(Socket)...

    java基于UNIX域套接字(unix domain socket)连接redis

    为了优化网络通信,有时我们会选择使用UNIX域套接字(UNIX Domain Socket,简称UDS)来代替传统的TCP/IP套接字进行进程间通信(IPC)。本篇将详细讲解如何在Java环境下,利用UNIX域套接字连接并操作Redis,以及涉及...

    Java Socket套接字

    Java Socket套接字是Java网络编程中的核心组件,它提供了应用程序之间进行低级通信的机制。...通过阅读提供的"Java套接字socket101"文档,你可以更深入地学习Socket编程的细节,从而更好地掌握这个强大的通信机制。

    Socket套接字—Java套接字编程(上1).rar_socket_套接字_套接字 Java

    "Socket套接字—Java套接字编程(上1)"这个资料包可能包含了关于Java套接字的基础概念、创建和使用过程,以及相关实例。下面我们将深入探讨Java中的套接字编程。 首先,Java中的Socket类是Java.io包的一部分,它提供...

    java套接字聊天

    总结,Java套接字聊天涉及到网络编程基础、多线程、数据传输与序列化、异常处理以及可能的安全措施。理解并熟练掌握这些知识点是开发类似应用的关键。通过`chat_socket_client`和`chat_socket_server`代码的学习和...

    java与c++通过socket通信

    1. 使用`socket`函数创建一个套接字,如`socket(AF_INET, SOCK_STREAM, 0)`,定义协议族、套接字类型和协议。 2. 绑定套接字到本地地址,使用`bind`函数,指定IP和端口。 3. 监听来自客户端的连接请求,使用`listen`...

    一个经典的java 套接字传输范例

    Java套接字(Socket)是网络编程中的基本概念,它为两台计算机之间的通信提供了低级别的接口。在Java中,套接字允许客户端应用程序连接到服务器,并通过网络发送和接收数据。下面,我们将深入探讨Java套接字传输的...

    Java 套接字(socket)111

    Java 套接字(socket)101 Java 套接字(socket)101

    Java套接字编程

    ### Java套接字编程详解 #### 一、Java网络编程概览 Java作为一种全面支持网络功能的编程语言,其强大的网络编程能力主要归功于它的一系列网络API,特别是位于`java.net`和`javax.net`包中的API。这些API为开发者...

    java套接字socket通信(UDP)

    该文挡中详细总结了Java中怎样通过socket实现客户端和服务器端发送UDP数据包来通信

    套接字(Socket)通信TCP聊天程序(含界面)

    在IT领域,套接字(Socket)是网络通信的基础组件,尤其在开发涉及客户端与服务器交互的应用时。本文将深入探讨“套接字(Socket)通信TCP聊天程序(含界面)”这一主题,包括如何使用Java中的Socket和ServerSocket...

    Java 套接字(socket)101

    Java套接字(Socket)是网络编程中的基本概念,它为两台计算机之间的通信提供了标准接口。在Java中,Socket类和ServerSocket类是进行网络通信的核心。本篇将深入探讨Java套接字的基本概念、工作原理以及如何使用它们...

    java套接字编程笔记

    Java套接字编程是网络通信的核心技术之一,它允许两个应用程序通过网络进行数据交换。在Java中,套接字(Socket)是实现客户端-服务器模型通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。这篇笔记将...

Global site tag (gtag.js) - Google Analytics