套接字工厂——ServerSocketFactory

接收器Acceptor在接收连接的过程中,根据不同的使用场合可能需要不同的安全级别,例如在支付相关的交易就必须对信息加密后再发送,这其中还涉及到密钥协商的过程,而在另外一些普通场合则无需对报文加密。反应到应用层则是使用http与https的问题,具体跟http/https相关的一些知识请到前面相关章节温习。

看一张跟https协议的组成层次图,它在应用层添加了一个TLS\SSL协议,于是组成了https协议。简单讲TLS\SSL协议给每次通信①提供认证服务,认证本次会话实体身份的合法性。②提供加密服务,强加密机制能保证通信过程中的消息不会被破译。③提供防篡改服务,利用Hash算法对消息进行签名,通过验证签名保证通信内容不被篡改。Java为开发者提供了方便的手段实现TLS\SSL协议,这就是安全套接字,它是Socket的安全升级版。Tomcat作为web服务器必须要实现对两种协议的支持,在java语言中,http协议对应Socket,而https则对应SSLScoket,在程序里根据不同的协议产生不同的套接字,于是引入了工厂模式处理套接字的相关操作,这个便是ServerSocketFactory工厂类。再一个由于不同厂商可自己定制SSL的实现,所以在具体程序实现时还有一些关于SSL实现的相关类,这些在前面的“Tomcat中的ssl安全信道的实现”章节有很详细的说明,可移步前往重新查阅。

ServerSocketFactory作为tomcat一个重要的组件,先看看它的运行逻辑是怎样的。首先说明下Tomcat中有两个工厂类DefaultServerSocketFactory和JSSESocketFactory,它们都实现了ServerSocketFactory接口,分别对应http协议套接字通道与https协议套接字通道。根据实际需求,假如机器的某端口使用加密通道则由JSSESocketFactory作为套接字工厂,反之则使用DefaultServerSocketFactory作为套接字工厂,于是tomcat中存在一个变量SSLEnabled用于标识是否使用加密通道,通过对此变量的定义就可以决定使用哪个工厂类,tomcat提供了外部配置文件供开发者和运维人员自定义。

实际上我们通过对server.xml进行配置就可以定义某个端口开放并是否使用安全通道,例如,

①   http协议对应的非安全通道

<service>

<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1" connectionTimeout="20000"redirectPort="8443" />

</service>

②    https协议对应的安全通道

<service>

<Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true"maxThreads="150" scheme="https" secure="true"clientAuth="false" sslProtocol="TLS" />

</service>

第一种配置告诉tomcat开放8080端口并使用http1.1协议进行非安全通信。第二种配置告诉tomcat开放8443端口并使用http1.1协议进行安全通信,其中安全协议是使用TLS协议。需要很注意的是加红加粗字体的SSLEnabled=”true”,此变量值会在tomcat启动初始化时读入自身程序中,运行时也正是通过此变量判断使用哪个套接字工厂,DefaultServerSocketFactory还是JSSESocketFactory。

把ServerSocketFactory工厂组件引入后整个结构图变为如下:

时间: 2024-10-23 16:18:27

套接字工厂——ServerSocketFactory的相关文章

Python套接字

1.客户端/服务器架构 什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统.在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务".它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求.另一方面,客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的回应,最后完成请求或给出故障的原因.服务器无限地运行下去,并不断地处理请求:而客户

[解决]通常每个套接字地址只允许使用一次

我们在做socket的开发的时候,经常会遇到这个错误:通常每个套接字地址 (协议/网络地址/端口)只允许使用一次 错误指示很明确:通信端口被占用了,导致通信无法进行. 但为什么端口被占用了呢?什么端口被占用了? 这里其实有一个大前提:你的程序中有没有指定socket通信端口? 如果指定了,解决办法很简单,每次通信完成手动释放就行了.下次通信重新建立连接. 如果没有指定,说明以下几点(可能你命中的是其中一点): 1.你的服务器开启的端口数太少: 2.连接释放等待时间太长: 3.你的socket通信

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

Java套接字编程实现群聊与私聊[原理版]

简介 运用Java套接字我们几乎可以完成一个网络聊天软件的小产品,本文不涉及UI部分,仅对原理部分用代码演示一下.一个可以多人聊天的小功能,在Linux系统上用telnet亲测可用. 服务器代码 package demo0811.demo3; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.

Linux 套接字(1)

套接字的特性由三个属性确定 :  域,  类型,   协议. 1.域 AF_UNIX  UNIX域协议 ( 文件系统套接字) AF_INET   ARPA因特网协议 (UNIX网络套接字) ...省略 2.类型 1)  流套接字:  SOCK_STREAM 2)  数据报套接字 :  SOCK_DGRAM 3. 协议 一般由套接字类型和套接字域来决定, 通常不需要选择. 将该参数设置为0表示使用默认协议. 套接字地址. 1)  AF_UNIX struct sockaddr_un { sa_fa

java.sql.SQLException: 无法从套接字读取更多的数据(mybatis 插入时)

今天  做mybatis 的批量插入的时候  出现 java.sql.SQLException: 无法从套接字读取更多的数据   的错误 解决方法: 由于批量插入的数据过大,需要分批次的插入. List<IdentificationData> insertList = new ArrayList<IdentificationData>(); for (IdentificationData domain : list) { insertList.add(domain); //批量插入

SO_REUSEADDR 套接字选项应用实例

网络上关于SO_REUSEADDR套接字选项用来解决地址重用问题的资料不少,但只停留在文字表达上,并没有实例,很容易误导初学者,并产生疑惑,此处不再赘述.下面通过一个简短的例子来展示如何在项目中合理的使用该选项,以及需要注意的问题. 关于TCP断开连接四次握手,如图所示 应用场景: 之前项目中遇到一个问题,聊天服务器的开启,关闭和重启,例如将服务器关闭后,实际上关闭了服务器的监听套接字(close),如果此时用户点击开启服务器,那么用户希望的情况是服务器又立即启动了.而由于close后,执行了主