详解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对象,监听端口号为8888
            ServerSocket 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,就会存在这一方面的问题。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第三十九章Java成员方法的声明和调用

声明成员方法可以定义类的行为,行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是用方法来实现的,属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型,其结构…

C# PaddleInference 文字检测(只检测不识别)

效果 项目 Demo下载 代码 using OpenCvSharp.Extensions; using OpenCvSharp; using Sdcb.PaddleInference.Native; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using Sys…

phar协议文件包含

实验目的 通过本实验,了解php封装伪协议,掌握phar协议文件包含的用法 实验环境 操作机:kali 靶机:Windows 2007 实验地址:http://靶机ip/exp/include2/phar/phar1/ 用户名:college 密码:360C…

Vue :在 VSCode 中安装 yarn 并用 yarn 工具来控制 Vue 项目的详细过程

Ⅰ、 Yarn 工具简介: 1、什么是 yarn 工具: Yarn 是 facebook 发布的一款取代 npm 的资源包管理工具,是一个快速、可靠、安全的依赖管理工具,一款新的 JavaScript 资源包管理工具(吐槽下:最大的弊端是,要通过 npm 来…

在blender中使用python程序化建模

blender中,所有可以在Blender软件中的手动操作,基本都可以通过Python API 完成 那么就可以用这个完成程序化生成 下面我给出一个简单的方块建模程序: 在scripting中,可以添加file,然后向场景中心放置一个正方体 首…

RK3588平台开发系列讲解(Camera篇)OV569摄像头调试

文章目录 一、摄像头识别检测二、查看摄像头支持的格式三、摄像头采集格式查询四、摄像头采集格式查询沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解OV569摄像头调试。 OV5695 是一种图像传感器,用于摄像头设备。要进行 OV5695 摄像头的调试,通常涉…

100种思维模型之能力圈思维模型-91

芒格说: “ 一个人在一生中可以真正得到的真见卓识仍然非常有限,所以正确的决策必须局限在自己的 ‘ 能力圈’ 以内。 ” 巴菲特说: “对你的 能力圈 来说,最重要的不是能力圈的范围大小,而是你如何能够 确定能…

Django核心

安装django pip install django # pip install django3.1.6创建django项目 在一个项目中可以包含多个应用程序。 django-admin startapp app_name #创建一个应用程序 django-admin startproject project_name #创建一个项目运行django项目 python manage.py runserver 80…

2. PS基本操作

因为网页美工大部分效果图都是利用PS ( Photoshop )来做的,所以以后我们大部分切图工作都是在PS里面完成 ●文件—>打开:可以打开我们要测量的图片 ●CtrlR : 可以打开标尺,或者视图—>标尺 ●右击标尺,把里面的单位改为像素 ●Ctrl加号…

Spring Boot实战:拦截器和监听器的应用指南

当使用Spring Boot时,我们可以通过拦截器(Interceptor)和监听器(Listener)来实现对请求和响应的处理。拦截器和监听器提供了一种可插拔的机制,用于在请求处理过程中进行自定义操作,例如记录日志…

【保姆级教程】PyCharm通过SSH远程连接ModelArts

文章目录 一、创建Notebook二、配置SSH三、配置远程Python解释器四、成果展示 一、创建Notebook 首先,找到云资源下面的 ModelArts,然后点击并进入 ModelArts控制台。 在ModelArts控制台中,点击开发环境下的 Notebook 。然后点击创建&#x…

NB-IoT学习笔记 —— NB-IoT介绍

一、简介 NB-IoT 是指窄带物联网(Narrow Band Internet of Things)技术,是一种低功耗广域(LPWA)网络技术标准,基于蜂窝技术,用于连接使用无线蜂窝网络的各种智能传感器和设备,聚焦于…

Airtest:Windows桌面应用自动化测试四【Airtest之python本地环境安装、独立IDE运行】

Airtest之python本地环境安装、独立IDE运行 一、环境配置二、安装Airtest三、安装poco四、常见问题4.1若运行代码时,在cv2模块报ImportError: DLL load failed: 找不到指定模块的错,有几种解决方案:4.1.1.本问题的根本原因应该是DLL文件的缺失…

供应链管理系统有哪些模块?

先弄搞清楚:供应链管理的概念与定义 供应链管理(Supply Chain Management ,简称SCM):就是指在满足一定的客户服务水平的条件下,为了使整个供应链系统成本达到最小而把供应商、制造商、仓库、配送中心和渠道商等有效地组织在一起来进行的产品…

list容器语法

文章目录 listlist基本概念list的优点:list的缺点:重要性质 list 的使用方法list构造函数list 赋值和交换list 长度/大小操作list 插入元素和删除元素访问list 反转和排序sort链表排序案例forward_list(C11)forward_list 的使用方…

STM32模拟I2C获取TCS34725光学颜色传感器数据

STM32模拟I2C获取TCS34725光学颜色传感器数据 TCS34725是RGB三色颜色传感器,和TCS34727都属于TCS3472系列,在电气特性上略有差别,TCS34727相比TCS34725在I2C总线的访问电平上可以更低,而在I2C软件访问地址方面则一致。 TCS3472内…

Nuget更新全局包、缓存和临时文件夹路径位置

Nuget更新缓存 1、查看默认的Nuget路径2、更改全局包路径2.1 通过环境变量来进行修改2.2通过Nuget.Config配置文件来进行修改 3、更改http-cache路径4、更改temp文件路径5、更改plugins-cache文件路径 NuGet是一个流行的软件包管理器,可以帮助.NET开发人员轻松地添加…

内嵌 iframe 实现PDF预览

效果图如下&#xff1a; 代码如下&#xff1a; <template><div><!-- 控制浮层显示隐藏 --><el-button type"primary" size"small" class"btn" click"dialogVisible true">PDF 预览 (内嵌 iframe)</el-but…

2021 RoboCom 世界机器人开发者大赛-高职组(初赛)

编程题得分&#xff1a;100 总分&#xff1a;100 目录 7-1 机器人打招呼 (5分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 7-2 人脸识别 (10分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例 1&#xff1a; 输…

yolov5增加AFPN-全新特征融合模块AFPN,效果完胜PAFPN

论文学习&#xff1a;AFPN: Asymptotic Feature Pyramid Network for Object Detection-全新特征融合模块AFPN&#xff0c;完胜PAFPN_athrunsunny的博客-CSDN博客 先上配置文件yolov5s-AFPN.yaml # YOLOv5 &#x1f680; by Ultralytics, AGPL-3.0 license# Parameters nc: 80…