详解JAVA Socket

目录

1.概述

2.使用

3.使用场景

3.1.web server中的网络通信

3.2.长连接

3.3.性能问题


1.概述

什么是网络通信:

就像打电话一样,两点间要通信,两点间就必须有连接,为了实现任意两个节点之间的通信,我们就必须采取手段将所有节点连接起来,形成了一个巨大的拓扑结构,这就是计算机网络,节点间利用这个网络进行数据传输,就是网络通信。

什么是TCP协议:

节点间利用计算机网络进行通信时,难免会出现丢失、乱序,或者网络故障,数据直接就传输不到等情况,所以会存在一些规则用来保证通信的可靠,TCP协议就是一种用来进行可靠通信的规则。TCP协议提供了一套机制来解决数据丢失、乱序、网络故障等异常情况。

博主之前有一篇博文详细介绍了TCP,感兴趣的小伙伴可以移步看一下:

详解TCP__BugMan的博客-CSDN博客

什么是socket:

很明显作为开发BS架构应用的主流语言,JAVA也是需要网络通信的,Socket就是JAVA网络通信的核心。可以理解为一个Socket就是一条TCP连接,Socket是对TCP/IP通信过程的一个抽象,它将TCP/IP里面复杂的通信逻辑进行 封装,对用户来说,只要通过一组简单的API就可以实现网络的连接和通信。

2.使用

服务端:

import java.io.*;
import java.net.*;public class Server {public static void main(String[] args) {try {// 创建ServerSocket对象,监听端口号为8888ServerSocket serverSocket = new ServerSocket(8888);System.out.println("Server started. Waiting for client...");// 接受客户端连接请求Socket socket = serverSocket.accept();System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());// 获取输入流和输出流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// 接收客户端发送的数据String clientMessage = reader.readLine();System.out.println("Received from client: " + clientMessage);// 发送响应给客户端String response = "Hello, client!";writer.println(response);System.out.println("Sent to client: " + response);// 关闭连接socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

客户端:

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) {try {// 创建Socket对象,连接服务器的IP地址和端口号Socket socket = new Socket("localhost", 8888);// 获取输入流和输出流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// 发送数据给服务器String message = "Hello, server!";writer.println(message);System.out.println("Sent to server: " + message);// 接收服务器响应String serverResponse = reader.readLine();System.out.println("Received from server: " + serverResponse);// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}
}

3.使用场景

3.1.web server中的网络通信

首先实际开发中很少会需要开发去手写网络通信,网络通信作为一个基础模块,web server,即常用的tomcat、netty等web服务器已经帮开发人员实现了网络通信,从而让开发人员更加专注于业务的开发。

tomcat底层就是使用的socket来进行网络通信,tomcat启动后默认会去8080端口监听,每进来一个新的client端的请求就会用一个socket去接收、处理。如果是老的client端的话会用老的socket来处理请求。也就是说一个client端对应一个socket。

3.2.长连接

每个TCP连接都需要分配一定的内存用于存储连接的状态信息、缓冲区以及其他相关数据。这些信息包括套接字描述符、接收和发送缓冲区、TCP状态等。TCP连接越多,服务器需要分配的内存也会增加,所以能保持的TCP连接的条数是有上限的。

为了保证其它TCP连接能被即使连接进来,Tomcat一类的web server在处理socket时策略很保守,不会让TCP一直开启,即不会让TCP一直保持长连接,在一定时间内没有收到client端的请求后会自动关闭TCP连接。

但我们知道建立TCP连接是一个很重的操作,所以有时候我们希望有些TCP连接可以一直打开,这时候就可以用到长连接的思想。

长连接是HTTP 1.2推出的标准,Tomcat实现了该标准。实现的办法很简单,将要保持长连接的TCP(Socket),交给一条线程,让线程一直活着就行。如果要实现长连接可以参照这个思路。

3.3.性能问题

socket会存在两方面的性能问题:

1.大量时间可能会被浪费在读IO上

accept的socket并不知道其数据包是否已经收完,很可能出现因为数据包没有收完,还需要阻塞在原地等待IO继续收数据包的情况,本来分过来的CPU时间片是希望当前线程向下执行代码,结果用去继续IO收数据包去了,IO操作对于CPU而言很慢,时间片的利用率会很低,耗时会很严重,这也是为什么JAVA后面推出了NIO的原因。

2.单端口读写的话会存在性能瓶颈

由于一个ServerSocket只能监听一个指定的端口,所以当我们在服务端只有一个端口来进行IO的时候,必然会存在性能瓶颈。因为IO的本质就是向某些内存中进行数据的读写,这些内存是专门用来进行IO的。如果只是用了一个端口,那么就只是用了这些内存中的一小块儿,可以想象,很容易就会被打满,导致IO阻塞。

tomcat启动后监听8080端口,就是用的单个端口进行IO,就会存在这一方面的问题。

为了克服这个问题,一种常见的方法是使用负载均衡和多线程技术。服务器可以通过负载均衡将连接分布到多个监听端口上,并使用多线程或线程池来处理连接和读写操作。这样可以提高并发处理能力和吞吐量,减轻单个端口的压力。

以上两个性能问题都是在实际开发中值得注意,可以进行性能优化的点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix监控

Zabbix监控 1.Zabbix监控概述1.1 zabbix是什么1.2 zabbix监控原理1.3 Zabbix 6.0新特性1.4 Zabbix 6.0功能组件1.5 Zabbix与prometheus区别对比 2. 部署Zabbix6.02.1 安装NginxPHP2.2 部署Mariadb数据库2.3 安装zabbix Server服务端2.4 部署Web前端,进行访问2.5 部署…

Vue 2.0 学习笔记——day01(环境配置+入门)

vue安装 版本 兼容性问题: Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。 有关EMCA:https://zhuanlan.zhihu.com/p/367249029 最新版本:v 2.7.14 …

Flink写入数据到ClickHouse

文章目录 1.ClickHouse建表1.ClickHouse依赖2.Bean实体类3.ClickHouse业务写入逻辑4.测试写入类5.发送数据 1.ClickHouse建表 ClickHouse中建表 CREATE TABLE default.test_write (id UInt16,name String,age UInt16 ) ENGINE TinyLog();1.ClickHouse依赖 Flink开发相关…

【Web3】认识NFT

NFT(非同质化代币)在Web3中扮演着重要的角色。Web3是指下一代互联网,它建立在区块链技术之上,旨在实现更加去中心化、透明和用户掌控的互联网。 NFT在Web3的一些重要作用: 唯一性和可证明稀缺性:NFT是一种…

第十二章 原理篇:vision transformer

参考教程: https://arxiv.org/pdf/2010.11929.pdf https://zhuanlan.zhihu.com/p/340149804 【大佬总结的非常好,他的好多篇文章都很值得学习】 文章目录 为什么会使用transformerVIT详解method获得patchpatch embeddingposition embedding 代码实现eino…

Spring Boot 集成 Redisson分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订…

【webrtc】vs2017 重新构建m98

配置了一台13900k的主机,需要重新配置webrtc 构建环境代码已经gclient sync 同步好了,打算重新构建:vs2017 的win10 sdk最大17763 vs2017 环境 set vs2017_install=S:\Program Files (x86)\Microsoft Visual Studio\2017\Communitywin10 SD

数字图像处理实验报告

目录 实验二、图像在空间域上的处理方法 实验三、图像在频率域上的处理方法 实验二、图像在空间域上的处理方法 一、实验目的 了解图像亮(灰)度变换与空间滤波的意义和手段;熟悉图像亮(灰)度变换与空间滤波的MATLA…

【AI机器学习入门与实战】机器学习算法都有哪些分类?

👍【AI机器学习入门与实战】目录 🍭基础篇 🔥 第一篇:【AI机器学习入门与实战】AI 人工智能介绍 🔥 第二篇:【AI机器学习入门与实战】机器学习核心概念理解 🔥 第三篇:【AI机器学习入…

得物社区推荐精排模型演进

1.背景 得物社区是一大批年轻人获取潮流信息、分享日常生活的潮流生活社区。其中用户浏览的信息,进行个性化的分发,是由推荐系统来决策完成的。目前得物社区多个场景接入了推荐算法,包括首页推荐双列流、沉浸式视频推荐、分类tab推荐流、直播…

DOM“文档对象模型”

目录 DOM 1.节点层级 1.2.节点 常用节点 文档节点(document) 元素节点(Element) 属性节点(Attribute) 文本节点(Text) 其他节点 DocumentType Comment DocumentFragment 1.3.节点树…

TCP的三次握手和四次挥手

一、网络七层协议 OSI七层协议模型主要是:物理层(Physical)、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表…