socket,tcp,http三者之间的区别和原理

socket,tcp,http三者之间的区别和原理,第1张

所谓Socket就是套接字,套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。

一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。

一、Socket(套接字)简介:

Socket(套接字)是通信的基石,是支持TCP/IP协议的路通信的基本 *** 作单元。可以将Socket(套接字)看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket(套接字)存在于通信域中,通信域是为了处理一般的线程通过Socket(套接字)通信而引进的一种抽象概念。Socket(套接字)通常和同一个域中的Socket(套接字)交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket(套接字)都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket(套接字)中,该 Socket(套接字)通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket(套接字)中,使对方能够接收到这段信息。 Socket(套接字)是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。

二、Socket(套接字)表达方式:

Socket(套接字)=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。

例如: 如果IP地址是210371451,而端口号是23,那么得到套接字就是(210371451:23)。


三、Socket(套接字)的主要类型:

1流套接字(SOCK_STREAM)

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。

2数据报套接字(SOCK_DGRAM)

数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

3原始套接字(SOCK_RAW)

原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。


要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为 Client Socket,另一个运行于服务器端,我们称之为 Server Socket。

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:

服务器监听


客户端请求

连接确认

1服务器监听

所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

2客户端请求

所调客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求。

3连接确认

所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求。

根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务。

面向连接服务的主要特点如下:

(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段;

(2)在传输过程中,各分组不需要携带目的主机的地址;

(3)可靠性好,但由于协议复杂,通信效率不高。

面向无连接服务的主要特点如下:

(1)不需要连接的各个阶段;

(2)每个分组都携带完整的目的主机地址,在系统中独立传送;

(3)由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象;

(4)通信效率高,但可靠性不能确保。

使用ServletSocket创建TCP服务器端

从图 中看上去TCP通信的两个通信实体之间并没有服务器端 客户端之分 但那是两个通信实体已经建立虚拟链路之后的示意图 在两个通信实体没有建立虚拟链路之前 必须有一个通信实体先做出 主动姿态 主动接收来自其他通信实体的连接请求

Java中能接受其他通信实体连接请求的类是ServerSocket ServerSocket对象用于监听来自客户端的Socket连接 如果没有连接 它将一直处于等待状态 ServerSocket包含一个监听来自客户端连接请求的方法

Socket accept() 如果接收到一个客户端Socket的连接请求 该方法将返回一个与客户端Socket对应的Socket(如图 所示每个TCP连接有两个Socket) 否则该方法将一直处于等待状态 线程也被阻塞

为了创建ServerSocket对象 ServerSocket类提供了如下几个构造器

ServerSocket(int port) 用指定的端口port来创建一个ServerSocket 该端口应该是有一个有效的端口整数值 ~

ServerSocket(int port int backlog) 增加一个用来改变连接队列长度的参数backlog

ServerSocket(int port int backlog InetAddress localAddr) 在机器存在多个 IP地址的情况下 允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址

当ServerSocket使用完毕 应使用ServerSocket的close()方法来关闭该ServerSocket 通常情况下 服务器不应该只接受一个客户端请求 而应该不断地接受来自客户端的所有请求 所以Java程序通常会通过循环 不断地调用ServerSocket的accept()方法 如下代码片段所示

//创建一个ServerSocket 用于监听客户端Socket的连接请求

ServerSocket ss = new ServerSocket( )

//采用循环不断接受来自客户端的请求

while (true)

{

//每当接受到客户端Socket的请求 服务器端也对应产生一个Socket

Socket s = ss accept()

//下面就可以使用Socket进行通信了

}

上面程序中创建ServerSocket没有指定IP地址 则该ServerSocket将会绑定到本机默认的IP地址 程序中使用 作为该ServerSocket的端口号 通常推荐使用 以上的端口 主要是为了避免与其他应用程序的通用端口冲突

       返回目录 疯狂Java讲义

       编辑推荐

       Java程序性能优化 让你的Java程序更快 更稳定

       新手学Java 编程

lishixinzhi/Article/program/Java/hx/201311/27266

首选移除布署的应用,来确定是Tomcat本身的错,还是你布署的应用有问题。

如果是布置的应用有问题。首先要确定webxml有没有问题,如果你写的东西很多,那就全部空,一点点加内容,来寻找看哪里出现错误。

如果webxml没有错,就要看是不是错少jar。

如果存在不识别jar的情况,将应用里的jar都放到Tomcat的lib下试试。

可能是系统文件损坏,如Win2K下的KERNEL32DLL,Win98 FONTS目录下面的字体等系统运行时基本的文件被破坏,系统在启动时会因此无法完成初始化而强迫重新启动。建议覆盖安装或重新安装。

可能是电脑中病毒了。冲击波病毒发作时还会提示系统将在60秒后自动启动,木马程序从远程控制你计算机的一切活动,包括让你的计算机重新启动。建议清除病毒,木马,或重装系统。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13382743.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存