详解JAVA Socket

这篇具有很好参考价值的文章主要介绍了详解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就可以实现网络的连接和通信。

详解JAVA Socket,JAVA EE,JAVA SE,网络,服务器,java

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,就会存在这一方面的问题。

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

以上两个性能问题都是在实际开发中值得注意,可以进行性能优化的点。文章来源地址https://www.toymoban.com/news/detail-523612.html

到了这里,关于详解JAVA Socket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JDK、JRE、Java SE、Java EE和Java ME有什么区别?

    Java现在已不仅仅是一种语言,从广义上说,它代表了一个技术体系。该体系根据应用方向的不同主要分为Java SE、Java EE和Java ME的3个部分。 1.SE(JavaSE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。 2.EE(JavaEE),enterprise edition,个业版,使用这种

    2024年02月12日
    浏览(43)
  • Java 网络编程 —— 创建多线程服务器

    一个典型的单线程服务器示例如下: 服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。 一般用并发性

    2024年02月02日
    浏览(48)
  • Java EE 网络原理之HTTP 响应详解

    表示了这次请求对应的响应,是什么样的状态 (成功,失败,其他的情况,对应的原因…) 这里的状态码非常多,我们需要了解里面常见的状态码 2XX 都表示 成功 200 最常见 3xx 表示 重定向 请求中访问的是 A 这样的地址,响应返回了一个重定向报文,告诉你应该要访问 B 地

    2024年02月03日
    浏览(49)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(65)
  • Java 网络编程 —— 创建非阻塞的 HTTP 服务器

    HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序。HTTP 客户程序和 HTTP 服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。HTTP 严格规定了 HTTP 请求和 HTTP 响应的数据格式,只要 HTTP 服务器

    2024年02月06日
    浏览(48)
  • Java 网络编程 —— 实现非阻塞式的服务器

    当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的连接,必须使用多线程 在非阻塞模式下, EchoServer 只需要启动一个主线程,就能同时处理三件事: 接收客户的连接 接收客户发送的数据 向客户发回响应数据 EchoServer 委托 Selector 来负责监控接

    2024年02月05日
    浏览(55)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(71)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(89)
  • Java | 详解 创建Web项目、配置Tomcat服务器、实现登录效果

    目录 一、相关工具及技术         1、相关工具         2、相关技术         3、相关 jar 包 二、IDEA 创建 web 项目         1、创建空项目         2、classes目录和lib目录配置         3、tomcat 服务器配置 三、MySQL 配置         1、登录 mysql         2、创建 user 表      

    2024年02月03日
    浏览(56)
  • 【网络原理】使用Java基于UDP实现简单客户端与服务器通信

    我们用Java实现UDP数据报套接字编程,需要借用以下API来实现 网络编程, 本质上是要操作网卡. 但是网卡不方便直接操作. 在操作系统内核中, 使用了一种特殊的叫做 “socket” 这样的文件来抽象表示网卡. 因此进行网络通信, 势必需要先有一个 socket 对象. DatagramSocket 是UDP Socket,

    2024年03月11日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包