JAVA:使用ServerSocket实现多线程的服务器功能

 

目录

一、服务端

二、Task任务类。

三、客户端请求


一、服务端

    创建数据源,并实现ServerSocket,当有连接进来时,创建Task任务类,交由线程池处理,主程序在s.accept();继续等待新的连接(这个等待是阻塞制的)。

package socket;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;import org.apache.tomcat.jdbc.pool.DataSource;/*** 多线程的serverSocket* @author Administrator**/
public class M {public static void main(String[] args) {// 配置数据源DataSource dataSource = new DataSource();dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/plc?characterEncoding=UTF8");dataSource.setUsername("root");dataSource.setPassword("111111");dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setValidationQuery("select 1 from dual");dataSource.setTestWhileIdle(true);dataSource.setTimeBetweenEvictionRunsMillis(30000);dataSource.setMinIdle(5);dataSource.setInitialSize(5);System.out.println(dataSource.getMinIdle());System.out.println(dataSource.getMaxIdle());System.out.println(dataSource.getMaxActive());System.out.println(dataSource.getIdle());System.out.println(dataSource.getActive());try(ServerSocket s = new ServerSocket(2001)){ExecutorService pool = Executors.newFixedThreadPool(3);while(true) {Socket socket = s.accept();pool.execute(new Task(socket,dataSource));ThreadPoolExecutor t = (ThreadPoolExecutor)pool;System.out.println("active:"+t.getActiveCount());System.out.println("core:"+t.getCorePoolSize());System.out.println("TaskCount"+t.getTaskCount());}} catch (IOException e) {e.printStackTrace();}}}

二、Task任务类。

    任务类里,通过socket.getInputStream()构建Scanner,从而读取请求信息(字符串),将字符串解析之后存入数据库。完成数据入库后,通过socket.getOutputStream()构建PrintWriter,从而写入信息返回给客户端。

package socket;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;import org.apache.tomcat.jdbc.pool.DataSource;public class Task implements Runnable {private Socket socket;private DataSource dataSource;public Task(Socket socket,DataSource dataSource) {super();this.socket = socket;this.dataSource = dataSource;}@Overridepublic void run() {try (InputStream inputStream = this.socket.getInputStream();Scanner scanner = new Scanner(inputStream);OutputStream out = socket.getOutputStream();PrintWriter pw = new PrintWriter(out);){boolean flag = true;while(flag && scanner.hasNextLine()) {String line = scanner.nextLine();if(line.trim().equals("exit")) {flag = false;pw.write("End");pw.flush();continue;}// 放入线程池,进行数据入库。try (Connection connection = dataSource.getConnection();){// line 入库// 业务逻辑SSSString[] split = line.split("\\|");if (split.length != 9 && split.length != 10) {throw new Exception("异常,数据应该为9列或10列");}String sql2 = "insert into plc_first4(ser_no,gong_xu_hao,niu_ju,jiao_du,ok_ng,gong_ju_hao,da_yin_ma,create_time)"+ "values (?,?,?,?,?,?,?,now())";PreparedStatement statement2 = connection.prepareStatement(sql2);statement2.setString(1, split[0]);statement2.setString(2, split[3]);statement2.setString(3, split[4]);statement2.setString(4, split[5]);statement2.setString(5, split[6]);statement2.setString(6, split[7]);statement2.setString(7, split[8]);statement2.execute();statement2.close();pw.write("e");pw.flush();// 业务逻辑EEEconnection.close();} catch (Exception e) {pw.write("f");pw.flush();e.printStackTrace();}}socket.close();} catch (IOException e) {e.printStackTrace();}}}

三、客户端请求

    构建Socket对象,通过client.getOutputStream();获取输出流,写入请求信息。完成之后获取输入流,从而读取服务端返回的信息,并打印出来。

package socket;import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*** 客户端请求* @author Administrator**/
public class Client {public static void main(String[] args) throws Exception {String ip ="127.0.0.1";Socket client = new Socket(ip, 2001);OutputStream outputStream = client.getOutputStream();outputStream.write("7005315-HS01*20240426001|1|1,3,4,2,8,P|1|8.67|0|OK| OP10|0|\n".getBytes());InputStream inputStream = client.getInputStream();byte[] b = new byte[1024];int read = inputStream.read(b);System.out.println(""+new String(b,0,read));outputStream.flush();client.shutdownOutput();client.close();}}

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

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

相关文章

手写一个vue2的diff案例

一、Vue为什么需要采用虚拟DOM? 虚拟 DOM 在 Vue 中起到了优化性能、提供跨平台兼容性 以及简化开发流程的作⽤。 虚拟 DOM 可以减少直接操作实际 DOM 的次数。虚拟 DOM 是⼀个抽象层,将实际 DOM 抽象为⼀个跨平台 的表示形式。使得vue 可以在不同的平…

yangwebrtc x86_64环境搭建

版本:5.0.099 sudo apt-get install libxext-dev sudo apt-get install x11proto-xext-dev sudo apt-get install libxi-dev sudo apt install libasound2-dev sudo apt install libgl1-mesa-dev sudo apt-get install libxtst-dev 用qt打开以下两个项目的.pro met…

WPF快速学习入门(8.视觉树和逻辑树)

WPF视觉树和逻辑树学习教程 WPF(Windows Presentation Foundation)是一种用于构建桌面应用程序的UI框架。在WPF中,有两种重要的树结构:视觉树和逻辑树。本文将介绍这两种树结构的概念、用途以及如何在实际项目中使用它们。 1. 视…

探索UWB模块的多功能应用——UWB技术赋能智慧生活

超宽带(Ultra-Wideband, UWB)技术,凭借其高精度、低功耗和强抗干扰能力,正在成为智能家居领域的一项关键技术。UWB模块的应用不仅提高了智能家居设备的性能,还为家庭安全、设备管理和用户体验带来了显著的改善。 UWB模…

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了,研究发现移到了左下角了,如下图所示: 上一次编辑位置快捷键: pycharm2024版 上一次编辑位置不见了,研究发现移到了左下角了,如下图所示: 上一次编辑…

Windows 80端口占用解决办法

启动软件系统前,有时遇见端口被其他程序占用,导致无法启动系统 解决办法: # 查看端口占用情况 > netstat -ano | findstr 端口号通常端口占用,通过任务管理器查看PID,结束任务可以完成。System进程占用,结束不了&…

惯性动作捕捉与数字人实时交互/运营套装,对高校元宇宙实训室有何作用?

惯性动作捕捉与数字人实时交互/运营套装,可以打破时空限制,通过动捕设备写实数字人软件系统动捕设备系统定制化数字人短视频渲染平台,重塑课程教学方式,开展元宇宙沉浸式体验教学活动和参观交流活动。 写实数字人软件系统内置丰富…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月31日预测第7弹

昨天的3D已命中!今天继续基于8883的大底,使用尽可能少的条件进行缩号。好了,直接上结果吧~ 首先,888定位如下: 百位:7,6,5,8,9,3,2,0 十位:3,4,5,2,1,7,8,9 …

视频汇聚EasyCVR平台GA/T 1400视图库应用:助力社会治安防控效能提升

在信息化、智能化的时代浪潮下,公安视频图像信息应用系统的发展与应用显得尤为重要。GA/T 1400标准,全称为《公安视频图像信息应用系统》,作为公安行业的一项重要标准,其视图库的应用在提升公安工作效能、加强社会治安防控等方面发…

C#中的空合并运算符与空合并赋值运算符:简化空值处理

在C#编程中,处理可能为null的值是一项常见的任务,尤其是在涉及数据库查询、Web服务调用或任何可能返回缺失数据的场景中。为了简化这类操作并提高代码的可读性,C# 8 引入了两个非常实用的运算符:空合并运算符 (??) 和 空合并赋值…

小白跟做江科大32单片机之按键控制LED

原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…

深入Kafka消息分区机制:从原理到实践

深入Kafka消息分区机制:从原理到实践 在现代分布式系统中,如何高效地处理海量数据是一个至关重要的问题。Apache Kafka作为一种高吞吐量的分布式消息系统,广泛应用于日志收集、实时分析等场景。为了保证数据的高效处理和系统的高可扩展性&am…

【C++奇技淫巧】CRTP(奇特重现模板模式)

CRTP(Curiously Recurring Template Pattern,奇特重现模版模式),是一种在C中使用模板来实现的设计模式,主要用于实现编译时多态性(静态多态)。这种模式通过类模板和模板继承机制来实现,使得派生…

【html知识】html中常用的表单元素+css格式美化

创作背景与目的: 随着互联网的飞速发展,表单作为网页交互的重要组成部分,扮演着收集用户信息、进行用户反馈的关键角色。本作品旨在总结并展示HTML中常用的表单元素,帮助开发者快速了解并应用这些元素,以优化网页的交…

自学成才Flutter 弹性布局、线性布局

本文我们要介绍 Flutter 中布局 Widget,包括弹性布局、线性布局 流式布局和层叠布局。 Flutter中文网 Flutter开发 一、弹性布局--Flex Flex 类似 Android 中的 FlexboxLayout,和 Expanded 配合使用可以实现子Widget 按照一定比例来分配父容器空间。 使…

数仓建模—企业数字化转型的本质

数仓建模—企业数字化转型的本质 数字化转型与数字化、数字化建设、数字化管理到底有什么差别?企业的数字化建设重点关注哪两个层面的实现?数字化转型中的“转型”到底指的是什么?数字化转型对企业有哪些最重要的挑战?转型的终极目标是什么?客户价值实现是转型的结果还是逻…

Web前端三大主流框架:React、Vue和Angular

在当前的Web开发领域,前端框架的选择对于项目的成功至关重要。作为一名资深的IT技术员,我对前端技术的发展和行业趋势保持着持续的关注。本文将介绍当前Web前端三大主流框架:React、Vue和Angular,并分析它们各自的优势。 React&a…

MyBatis通用Mapper:简化数据库操作的利器

引言 在软件开发中,数据库操作是不可或缺的一部分。通常我们会使用mybatis,的MBG插件,自动生成表对应的基本操作语句xml。 当我们的表字段发生变化的时候,我们需要修改实体类和Mapper文件定义的字段和方法。如果是增量维护&…

【学习笔记】数据结构(一)

基本概念和术语 👉数据:所有能被输入到计算机中,且被计算机处理的符号的集合; 是计算机操作对象的总称;是计算机处理信息的载体;是信息的某一种特定的符号表示形式包括数值型数据、非数值型数据 &#x1…

git生成密钥(免密)

生成SSH密钥对的方法如下: 打开Git Bash。 输入以下命令生成新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 这里的 -C 参数后面跟的是你的邮箱地址,通常用于标识这个密钥。 当系统提示你“Enter a fil…