java socket tcp 长连接_java socket长连接

2023-11-11

package com.paic.umap.tcp;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.ConcurrentHashMap;

/**

* C/S架构的服务端对象。

*

* @since 1.0

*/

public class Server {

/**

* 要处理客户端发来的对象,并返回一个对象,可实现该接口。

*/

public interface ObjectAction{

Object doAction(Object rev);

}

public static final class DefaultObjectAction implements ObjectAction{

public Object doAction(Object rev) {

System.out.println("处理并返回:"+rev);

return rev;

}

}

public static void main(String[] args) {

int port = 65432;

Server server = new Server(port);

server.start();

}

private int port;

private volatile boolean running=false;

private long receiveTimeDelay=3000;

private ConcurrentHashMap actionMapping = new ConcurrentHashMap();

private Thread connWatchDog;

public Server(int port) {

this.port = port;

}

public void start(){

if(running)return;

running=true;

connWatchDog = new Thread(new ConnWatchDog());

connWatchDog.start();

}

@SuppressWarnings("deprecation")

public void stop(){

if(running)running=false;

if(connWatchDog!=null)connWatchDog.stop();

}

public void addActionMap(Class cls,ObjectAction action){

actionMapping.put(cls, action);

}

class ConnWatchDog implements Runnable{

public void run(){

try {

ServerSocket ss = new ServerSocket(port,5);

while(running){

Socket s = ss.accept();

new Thread(new SocketAction(s)).start();

}

} catch (IOException e) {

e.printStackTrace();

Server.this.stop();

}

}

}

class SocketAction implements Runnable{

Socket s;

boolean run=true;

long lastReceiveTime = System.currentTimeMillis();

public SocketAction(Socket s) {

this.s = s;

}

public void run() {

while(running && run){

if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){

overThis();

}else{

try {

InputStream in = s.getInputStream();

if(in.available()>0){

ObjectInputStream ois = new ObjectInputStream(in);

Object obj = ois.readObject();

lastReceiveTime = System.currentTimeMillis();

System.out.println("接收:\t"+obj);

ObjectAction oa = actionMapping.get(obj.getClass());

oa = oa==null?new DefaultObjectAction():oa;

Object out = oa.doAction(obj);

if(out!=null){

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());

oos.writeObject(out);

oos.flush();

}

}else{

Thread.sleep(10);

}

} catch (Exception e) {

e.printStackTrace();

overThis();

}

}

}

}

private void overThis() {

if(run)run=false;

if(s!=null){

try {

s.close();

} catch (IOException e) {

e.printStackTrace();

}

}

System.out.println("关闭:"+s.getRemoteSocketAddress());

}

}

}

package com.paic.umap.tcp;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.concurrent.ConcurrentHashMap;

/**

* C/S架构的客户端对象,持有该对象,可以随时向服务端发送消息。

*

* @since 1.0

*/

public class Client {

/**

* 处理服务端发回的对象,可实现该接口。

*/

public static interface ObjectAction {

void doAction(Object obj,Client client);

}

public static final class DefaultObjectAction implements ObjectAction {

public void doAction(Object obj,Client client) {

System.out.println("处理:\t"+obj.toString());

}

}

private String serverIp;

private int port;

private Socket socket;

private boolean running=false;

private long lastSendTime;

private ConcurrentHashMap actionMapping = new ConcurrentHashMap();

public Client(String serverIp, int port) {

this.serverIp=serverIp;this.port=port;

}

public void start() throws UnknownHostException, IOException {

if(running)return;

socket = new Socket(serverIp,port);

System.out.println("本地端口:"+socket.getLocalPort());

lastSendTime=System.currentTimeMillis();

running=true;

new Thread(new KeepAliveWatchDog()).start();

new Thread(new ReceiveWatchDog()).start();

}

public void stop(){

if(running)running=false;

}

/**

* 添加接收对象的处理对象。

* @param cls 待处理的对象,其所属的类。

* @param action 处理过程对象。

*/

public void addActionMap(Class cls,ObjectAction action){

actionMapping.put(cls, action);

}

public void sendObject(Object obj) throws IOException {

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

oos.writeObject(obj);

System.out.println("发送:\t"+obj);

oos.flush();

}

class KeepAliveWatchDog implements Runnable {

long checkDelay = 10;

long keepAliveDelay = 2000;

public void run() {

while(running){

if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){

try {

Client.this.sendObject(new KeepAlive());

} catch (IOException e) {

e.printStackTrace();

Client.this.stop();

}

lastSendTime = System.currentTimeMillis();

}else{

try {

Thread.sleep(checkDelay);

} catch (InterruptedException e) {

e.printStackTrace();

Client.this.stop();

}

}

}

}

}

class ReceiveWatchDog implements Runnable {

public void run() {

while(running){

try {

InputStream in = socket.getInputStream();

if(in.available()>0){

ObjectInputStream ois = new ObjectInputStream(in);

Object obj = ois.readObject();

System.out.println("接收:\t"+obj);

ObjectAction oa = actionMapping.get(obj.getClass());

oa = oa==null?new DefaultObjectAction():oa;

oa.doAction(obj, Client.this);

}else{

Thread.sleep(10);

}

} catch (Exception e) {

e.printStackTrace();

Client.this.stop();

}

}

}

}

public static void main(String[] args) throws UnknownHostException, IOException {

String serverIp = "127.0.0.1";

int port = 65432;

Client client = new Client(serverIp,port);

client.start();

}

}

package com.paic.umap.tcp;

import java.io.Serializable;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

* 维持连接的消息对象。

*

* @since 1.0

*/

public class KeepAlive implements Serializable{

private static final long serialVersionUID = -2813120366138988480L;

/* 覆盖该方法,仅用于测试使用。

* @see java.lang.Object#toString()

*/

@Override

public String toString() {

return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\t维持连接包";

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java socket tcp 长连接_java socket长连接 的相关文章

  • QString 转换为 char */ unsigned char *

    1 QString 转换为 char 将 QString 转 char 需要用到 QByteArray 类 QByteArray 类的说明详见 Qt 帮助文档 因为 char 最后都有一个 0 作为结束符 而采用 QString toLat
  • 数据分析入门-SARIMA模型案例分析(超详细)

    由于代码中注释已经非常的清晰 文章中就不过多叙述了 直接上代码 代码如下 在开始之前先导入所需要的包 import warnings do not disturbe mode warnings filterwarnings ignore i
  • 9.9+9.14字节三轮面试手撕代码记录

    一 根据字符出现的频率重新排列字符串 如 happy gt pphap import java util Scanner import java util Map import java util HashMap import java u
  • 电感升压(boost电路)感性理解

    目录 前言 一 电感升压基本原理 二 工作原理步骤 1 开关闭合 给电感和电容充电 电容获得输入电压 2 开关断开 电感继续给电容充能 电容获得更高电压 总结 前言 以前在消费类小家电方案中 经常用到电感升压的应用 一个很典型的应用是手持小
  • sh脚本报错“eval: line 1: syntax error: unterminated quoted string”

    有个之前一直正常运行的脚本 突然报错了 eval line 1 syntax error unterminated quoted string 提示也比较直接eval使用出的问题 过滤一下脚本内容 果然找到了一个疑似问题代码 eval ec
  • 切割列表[]

    import sys def sliceABC sequence start 0 K len sequence if start gt K print 切割数量超出范围 sys exit return sequence start K se
  • Kaplan-Meier生存曲线绘制

    Kaplan Meier生存曲线绘制 生存分析研究的是某个事件发生之前过去的时间 在临床研究中最常见的应用就是死亡率的估计 预测患者的生存时间 不过生存分析也可以应用于其他领域如机械故障时间等 在R中 survival包中有很多函数可以对生
  • 定根最小树形图 朱刘算法 luogu P4716

    https www luogu org problem P4716 include
  • python混淆矩阵实证分析_如何在Python中编写混淆矩阵?

    I wrote a confusion matrix calculation code in Python def conf mat prob arr input arr confusion matrix conf arr 0 0 0 0
  • Google Colab 读取/存储 云盘内的文件

    背景 Google Colaboratory是谷歌开放的一款研究工具 主要用于机器学习的开发和研究 这款工具让广大的AI开发者可以使用免费的GPU 在训练模型时 使用GPU自然速度飞快 那么训练完之后最重要的自然就是将训练出来的模板数据保存
  • 华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统

    此文章转自乐字节 一生万物 万物归一 这不是哪部武侠小说的招式 也不是哪部哲学作品的思想 它是华为鸿蒙系统的设计理念 化简为繁 精妙绝伦 相信大家都知道 自从华为推送了鸿蒙OS手机Bate版本系统以后 不少参与鸿蒙系统内测用户便纷纷反馈 在
  • XCTF:NewsCenter

    题目如下 因为有输入框 我习惯初步判断它为sql注入 1 测试是否存在注入点 输入 1 结果报错了 然后尝试 1 2 知道存在注入 且为字符型注入 然后进行字段数猜测 直到字段数为4开始报错 3 尝试获得显示位 4 查库名 5 查表名 6
  • Python计算出给定的时间段的具体日期列表-大全

    由于工作中经常用到关于用户自定义时间 来进行后台数据的查询 特意整理了一下工作中常用的到的关于时间列表的一个函数 可以计算出某一年中的具体哪个周的开始和结束日期 某个周的具体日期列表 2015年38周 自定义时间段的具体日期列表 20150
  • 华为OD机试真题-找出两个整数数组中同时出现的整数-2023年OD统一考试(B卷)

    题目描述 现有两个整数数组 需要你找出两个数组中同时出现的整数 并按照如下要求输出 1 有同时出现的整数时 先按照同时出现次数 整数在两个数组中都出现并且出现次数较少的那个 进行归类 然后按照出现次数从小到大依次按行输出 2 没有同时出现的
  • 基于人工大猩猩部队优化CNN-LSTM(GTO-CNN-LSTM)多变量时间序列预测(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 专家学者根据对人类视觉的研究 提出了注意力
  • win7虚拟图形服务器,ZNetCManager win7版

    ZNetCManager是一款虚拟串口服务器软件 它可以在你的电脑上构建出多个虚拟串口 不过功能和真实串口是一样的 你可以通过软件将数据传输到局域网内其他的串口设备上 让您即便是没有串口 也能对串口进行通信 ZNetCManager功能介绍
  • termius设置中文 v7.0.1附使用教程

    提起Windows平台远程终端 XShell的大名想必不用多说了 但它也只有Windows版本 携带非常不方便 为此小编今日要推荐的是termius全平台的远程终端 该软件不仅涵盖了Windows Linux OSX 还支持Android和
  • 几种存segmentation mask方法对比

    发现同一幅图的原图 jpg 1920 1080 1920 times 1080 1920 1080 才 155K 其用 npy 存的 segmentation mask 居然有 2M 按理 segmentation mask 只有一个通道
  • 安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)

    报错截图 1 首先检查node js是否安装成功 输入 node v 若可查看版本号 如图所示即安装成功 若不一致则重新安装node js node js官方下载地址 https nodejs org en download 2 查看npm

随机推荐

  • Selector和Epoll区别

    Selector和Epoll区别 select原理 原理还是轮询所有文件描述符 将文件描述符集合fd set从用户空间拷贝到内核空间 进入内核态 遍历所有文件描述符 对每个文件描述符调用poll 该函数返回一组标准的掩码 其各个位指示相应的
  • Python爬虫之Js逆向案例(16)- xx商品评论&店铺详情案例

    一次运行程序 同时获取一下内容 1 获取商店详情 2 获取当前商品评论 3 获取商品的问题 答案 效果如下图 下面会进行以下几步进行分析 下方演示过程全部使用chrome浏览器 1 抓包找到对应接口 商店详情https item soa j
  • 后端Windows软件环境安装配置大全[JDK、Redis、RedisDesktopManager、Mysql、navicat、VMWare、finalshell、MongoDB...持续更新中]

    文章目录 前言 1 安装 JDK 2 安装 Redis 3 安装 RedisDesktopManager Redis可视化工具 4 安装 Mysql 5 安装 navicat Mysql可视化工具 6 安装 VMWare 7 安装 fina
  • Qt-多层嵌套界面类对象之间信号连接的一种方法-信号中转类

    项目中存在多个界面类对象 并且存在比较深的嵌套关系 这时候如果希望连接顶层的对象信号到底层的对象槽 一种方法是逐级连接信号 但是这种方法要写很多个connect函数 并且对不熟悉此代码的人来说 需要一层一层跟进才知道这个信号最终由哪个槽函数
  • 【Python】字符转换为 ASCII 码

    ord 函数将单个字符转换为 ASCII 码 chr相反 print ord A ord b print list map ord a z c print list map chr 97 122 99 输出结果 65 98 97 122 9
  • javascript实现经典排序

    排序是我们生活中经常面对的问题 做操时需要从小到大排序 我们逛电商网站 常常按价格排序 像这样我们把多个序列按照关键词递增 递减 的方式进行排列 使得序列成为一个按关键字有序的序列 这样的操作就称为排序 1 冒泡排序 冒泡排序是一种交换排序
  • 【查看linux中所有用户的三种方式】

    查看linux中所有用户的三种方式学习目标 提示 通过使用 etc passwd 文件 getent 命令 compgen 命令这三种方法查看系统中用户的信息 用户信息存放位置 提示 Linux 系统中用户信息存放在 etc passwd
  • shiro权限管理

    shiro ssm maven实现的权限管理 里面包含数据库文件 演示地址 登录 后台管理 包含角色管理 管理员可以对每个角色进行菜单分配 菜单管理 可以添加菜单 有子父级 用户管理 操作日志 系统日志 系统监控 在此基础上二次开发简直完美
  • 当系统中登录用户的角色和权限改变时的处理方法

    一 当登陆在线的用户的角色的权限改变时处理 1 登陆时将用户的所有权限放入session之中 2 在filter中加入判断信息 动态去数据库查询当前用户的权限和session中的权限的集合大小进行比较 不一致 移除session中的旧权限
  • [AHK]新浪实时股票数据接口

    2022年1月 发现 新浪接口反馈 Kinsoku jikou desu 已有新的方法 如需获取实时股票价格 当前价格 涨停价 跌停价 等 请联系weixin sunwind1576157 AHK 腾讯实时股票数据接口 AHK 腾讯实时股票
  • GO语言常用标准库 fmt

    GO语言常用标准库 fmt 1 fmt fmt包实现了类似C语言printf和scanf的格式化I O 主要分为向外输出内容和获取输入内容两大部分 1 1 1 向外输出 标准库fmt提供了以下几种输出相关函数 Print Print系列函数
  • 1024Byte(字节)=1KB

    二进制数系统中 每个0或1就是一个位 bit 位是数据存储的最小单位 计算机中的CPU位数指的是CPU一次能处理的最大位数 例如32位计算机的CPU一次最多能处理32位数据 字节 Byte 是通过网络传输信息 或在硬盘或内存中存储信息 的单
  • 【转】本地jar 上传到maven仓库

    Maven环境准备 下载maven安装包 解压后配置好path环境变量 具体配置请参考百度 注意一般maven仓库有两个目录可以上传 maven snapshots 和 maven releases 一般快照 也就是jar的后缀名为snap
  • Python:安装paddlepaddle后运行代码报错ImportError: core_avx.so: undefined symbol: _dl_sym, version GLIBC_PRIVA

    是paddlepaddle版本导致的 出现问题时我安装的版本是 python m pip install paddlepaddle 2 3 1 i https pypi tuna tsinghua edu cn simple 改成下面这个版
  • Spring(做项目常用的网址)

    目录 1 后端maven中央仓库 2 jquery官网下载 3 mybatis文档中文版 4 mybatis英文文档 5 mybatis生成逆向工程代码及网址 6 Spring网址 附注常用到的代码 7 使用 Controller注解为什么
  • 【数据库原理复习题】

    文章目录 一 单选题 二 填空题 三 判断题 四 简答题 五 综合题 5 1 属性集合的闭包计算 5 2 确定候选码并进行范式级别的判断 5 2 1 确定候选码讲解 5 2 2 范式级别的判断讲解 5 3 根据要求写SQL语句 5 3 1数
  • canvas绘制小树阴影-transform

    绘制小路 可用quadraticCurveTo 二次贝塞尔曲线 来绘制复杂曲线 也可以用bezierCurveTo 三次贝塞尔曲线 效果图 代码如下 demo html
  • 深度学习环境配置8——(30系显卡)windows下的torch==1.7.1环境配置

    深度学习环境配置8 30系显卡 windows下的torch 1 7 1环境配置 注意事项 一 2021 10 8更新 学习前言 各个版本pytorch的配置教程 环境内容 环境配置 一 Anaconda安装 1 Anaconda的下载 2
  • 计算机毕业设计Node.js+Vue会议管理系统(程序+源码+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • java socket tcp 长连接_java socket长连接

    package com paic umap tcp import java io IOException import java io InputStream import java io ObjectInputStream import