socket系列之服务器端socket——ServerSocket类

简介: 一般地,Socket可分为TCP套接字和UDP套接字,再进一步,还可以被分为服务器端套接字跟客户端套接字。这节我们先关注TCP套接字的服务器端socket,Java中ServerSocket类与之相对应,这个类主要用于如何在服务器端创建一个套接字服务,建立一个通信终端,被动地等待客户端的连接,一旦有数据进入被监听的端口,这个类将能接收这些数据。

一般地,Socket可分为TCP套接字和UDP套接字,再进一步,还可以被分为服务器端套接字跟客户端套接字。这节我们先关注TCP套接字的服务器端socket,Java中ServerSocket类与之相对应,这个类主要用于如何在服务器端创建一个套接字服务,建立一个通信终端,被动地等待客户端的连接,一旦有数据进入被监听的端口,这个类将能接收这些数据。
ServerSocket类位于java.net包中,它有很多方法,包括创建socket实例、绑定端口,阻塞接收连接等。一般服务器按以下几步进行工作:
① 建一个ServerSocket实例,绑定监听指定的本地端口,这样服务器套接字就能接收指定端口的连接。
② ServerSocket实例调用accept()方法进行阻塞,获取下一个客户端连接,如果有客户端连接则创建一个socket并返回。
③ 对②返回的socket进行处理,一般使用socket实例的InputStream对象跟OutputStream对象与客户端进行通信。
④ 通信完后,使用socket的close方法关闭客户端套接字连接。
⑤ 循环执行②到④,不断接收下一个客户端连接。
Serversocket到底是如何进行工作的?底层究竟是怎么运作的?应用层的操作是怎样反应到系统底层的?图2-3-2-2试图说明ServerSocket的工作原理。以虚线分割,上层为应用层,下层为系统底层。整个流程可以分为以下几步:
(1)利用ServerSocket的构造函数创建一个ServerSocket实例,传入端口号,即是监听的端口号。
(2)接着ServerSocket实例会进行阻塞操作,初始化底层socket并将进行监听。
(3)创建socket底层数据结构,这个socket初始状态为关闭。
(4)填入应用层传入的端口号并且设置socket状态为监听状态。
(5)服务器端开始监听客户端的访问。
(6)客户端访问时经过三次握手完成连接,准备接收socket连接。
(7)为该连接创建一个新的套接字数据结构,根据到来的分组报文设置远程端口跟远程IP。由于是完成了三次握手了,所以把状态设置为连接建立。
(8)建立好连接的底层套接字数据结构会被放到一个队列缓冲区,供应用层读取。
(9)Serversocket实例调用accept()方法后,即开始轮询上面的队列缓冲区,一旦队列中有新的连接,则马上创建并返回一个应用层的socket实例。
(10)如此进行工作,等待客户端的访问,直到Serversocket实例关闭。

 
图2-3-2-2 ServerSocket底层工作原理

由此看来,创建一个Serversocket实例,其实就是创建一个socket,并向TCP/IP协议栈声明对某一端口的占有,同时监听此端口, 在系统Socket层会将所有发往此端口的数据包缓存到一个区域,而Serversocket的accept()方法其实就是不断获取缓存区域的socket,在应用层表现为每当有一个连接,就能获取一个socket。



==========广告时间==========

鄙人的新书《Tomcat内核设计剖析》已经在京东预售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

=========================

目录
相关文章
|
3月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
180 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
3月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
197 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
7月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
117 0
|
3月前
|
Linux 开发工具 Docker
各个类linux服务器安装docker教程
各个类linux服务器安装docker教程
77 0
|
5月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
161 0
|
6月前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
7月前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送"Hello, Server!"后关闭。注意Android中需避免主线程进行网络操作。
120 4
|
6月前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
108 0
|
7月前
|
Java
java使用ServerSocket和Socket实现客户端与服务端通讯
java使用ServerSocket和Socket实现客户端与服务端通讯
|
7月前
|
网络协议 Java Linux
探索Java Socket编程:实现跨平台客户端-服务器通信的奥秘
【6月更文挑战第21天】Java Socket编程示例展示了如何构建跨平台聊天应用。服务器端使用`ServerSocket`监听客户端连接,每个连接启动新线程处理。客户端连接服务器,发送并接收消息。Java的跨平台能力确保代码在不同操作系统上无需修改即可运行,简化开发与维护。
64 0