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

2024-05-27 15:20

本文主要是介绍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();}}

这篇关于JAVA:使用ServerSocket实现多线程的服务器功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007853

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没