java代码

1.根据session获取客户端的ip地址

        String clientIP = "";try {InetAddress  inetAddress  = ((NettyChannel) iSession.getCurChannel()).getRemoteAddress().getAddress();byte[] ipAddress = inetAddress.getAddress();for (int i = 0; i < ipAddress.length; i++) {if (i > 0) {clientIP += ".";}clientIP += ipAddress[i] & 0xFF;}} catch (Exception e) {// e.printStackTrace();}

2.新增对外的curl接口

import com.google.gson.Gson;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ConfigurableApplicationContext;import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;public class RPCGmServerTask extends Thread{private static final Logger LOGGER = LoggerFactory.getLogger(RPCGmServerTask.class);public RPCGmServerTask(){}@Overridepublic void run() {try {HttpServer server = HttpServer.create(new InetSocketAddress(2720), 0);server.createContext("/", new MyHandler());server.setExecutor(null); // creates a default executorserver.start();} catch (Exception e) {LOGGER.error("run->{}", e);}}static class MyHandler implements HttpHandler {@Overridepublic void handle(HttpExchange exchange) throws IOException {InputStream is = exchange.getRequestBody();BufferedReader br = new BufferedReader(new InputStreamReader(is));String inputLine;while ((inputLine = br.readLine()) != null) {System.out.println(inputLine);try {String cmd = inputLine.toString();if (cmd.startsWith("//")) {System.out.println("gmgmgm:" + cmd.substring(2));String cmd2 = cmd.substring(2);GmService.exeCmd(cmd2);}} catch (Exception e) {System.out.print("gmException" + e);}}exchange.sendResponseHeaders(200, 0);exchange.close();}}}

3.jar包的各种启动方式超详细总结

jar包的各种启动方式超详细总结_java_脚本之家

1.java -jar

java -jar test.jar

弊端1:exit 退出终端会导致java进程中断。
弊端2:ctrl+c 退出启动展示页会导致java进程中断。
弊端3:直接关闭终端会导致java进程中断(启动时和启动完关闭都会导致java进程终端)。
弊端4:控制台日志不打印(这个可以不算弊端吧,其实很多场景不需要这个日志,这里姑且算是吧)

2.java -jar test.jar &

弊端1:直接关闭终端会导致java进程中断(启动时和启动完关闭都会导致java进程终端)。
弊端2:控制台日志不打印(这个可以不算弊端吧,其实很多场景不需要这个日志,这里姑且算是吧)

3.nohup java -jar test.jar

弊端1:exit 退出终端会导致java进程中断。
弊端2:ctrl+c 退出启动展示页会导致java进程中断。
弊端3:直接关闭终端会导致java进程中断(启动时和启动完关闭都会导致java进程终端)。

4.nohup java -jar test.jar &

弊端1:日志定向输出当前文件夹下的nohup.out(与下面几个命令相比,姑且算是弊端吧)

5.nohup java -jar test.jar > ./info.log &

该命令没有弊端,与上一个场景的区别是会将日志打印到指定的info.log下面。不过打印方式是覆盖。也就是说每次启动以后,都会将之前的日志覆盖

6.nohup java -jar test.jar >> ./info.log &

该命令没有弊端,与上一个场景的区别是会将日志打印到指定的info.log下面。不过打印方式是拼接。也就是说每次启动以后,都会将本次的日志拼接到原日志之后进行输出,这里日志因为是控制台日志,一般没必要拼接

7.nohup java -jar test.jar >> /dev/null &

这个命令是将日志输出到/dev/null,/dev/null是linux系统里的黑洞,其实可以理解为垃圾桶,相当于把日志扔了不要了,其他就没什么区别了。

4. CopyOnWriterArrayList 

CopyOnWriterArrayList 详解_copyonwritearraylist-CSDN博客

1. 简介

在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList。

2. 原理

很多时候,我们的系统应对的都是读多写少的并发场景。CopyOnWriteArrayList容器允许并发读,读操作是无锁的,性能较高。至于写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。

线程安全的,多线程环境下可以直接使用,无需加锁;
通过锁 + 数组拷贝 + volatile 关键字保证了线程安全;
每次数组操作,都会把数组拷贝一份出来,在新数组上进行操作,操作成功之后再赋值回去。

从整体架构上来说,CopyOnWriteArrayList 数据结构和 ArrayList 是一致的,底层是个数组,只不过 CopyOnWriteArrayList 在对数组进行操作的时候,基本会分四步走:

加锁;
从原数组中拷贝出新数组;
在新数组上进行操作,并把新数组赋值给数组容器;
解锁。

除了加锁之外,CopyOnWriteArrayList 的底层数组还被 volatile 关键字修饰,意思是一旦数组被修改,其它线程立马能够感知到,代码如下:

private transient volatile Object[] array;
整体上来说,CopyOnWriteArrayList 就是利用锁 + 数组拷贝 + volatile 关键字保证了 List 的线程安全。

5.--spring.config.location命令学习

--spring.config.location命令主要是为了加载springBoot jar 外部的配置文档,比如我们可以将日志的级别控制放在jar外面的配置文档中,可以方便线上调试,不用改动jar中的配置文档,再打包这样比较麻烦的操作。

注意:当使用了这个命令后外面的配置文档级别要高于里面的文档,所以外面的属性会覆盖里面的,当然所有文档都是互补的,没有的话就相互补充。 

#!/bin/bashpackage="gameSrv.jar"
cfg="./assets/config/gameSrv.properties"
log="./logs/gameSrv.log"
mypackage=$PWD/$package
nohup java -jar $package --spring.config.location=$cfg --mypackage=$mypackage >> $log 2>&1 &sleep 5
PID=$(ps -ef | grep $mypackage | grep -v grep | awk '{ print $2 }')
if [ -z "${PID}" ]; thenecho start ${mypackage} fail
elseecho start ${mypackage} success ${PID}
fi

 6.Caused by: java.io.IOException: Connection reset by peer

这个错误的意思是:对方主机(peer)在建立连接时发送了一个重置连接的请求,导致连接中断。这可能是由于对方主机遇到了一些问题,或者是对方主机关闭了连接。

7.StringBuffer与StringBuider  

深度剖析Java中StringBuffer与StringBuider两个类的异同_stirngbuffer和-CSDN博客

StringBuffer

String 的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间。

StringBuffer类和String类一样,也用来表示字符串,但是StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,在内存使用上要优于String。StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。
StringBuffer不像String,只能通过 new 来创建对象,不支持简写方式

StringBuffer str1 = new StringBuffer();  // 分配16个字节长度的缓冲区
StringBuffer str2 = =new StringBuffer(512);  // 分配512个字节长度的缓冲区
// 在缓冲区中存放了字符串,并在后面预留了16个字节长度的空缓冲区
StringBuffer str3 = new StringBuffer("青00 studyjava");

 主要方法

StringBuffer str = new StringBuffer(“biancheng100”);
str.append(true);
则对象str的值将变成”biancheng100true”。StringBuffer str = new StringBuffer("abcdef");
str. deleteCharAt(3);
该代码将会删除索引值为3的字符,即”d“字符。StringBuffer str = new StringBuffer("abcdef");
str.delete(1, 4);
该代码会删除索引值为1~4之间的字符,包括索引值1,但不包括4。StringBuffer str = new StringBuffer("abcdef");
str.insert(3, "xyz");
最后str所指向的字符串为 abcdxyzef。StringBuffer str = new StringBuffer("abcdef");
str.setCharAt(3, 'z');
该代码将把索引值为3的字符修改为 z,最后str所指向的字符串为 abczef。

StringBuilder

StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。

  • 操作少量的数据使用 String;
  • 单线程操作大量数据使用 StringBuilder;
  • 多线程操作大量数据使用 StringBuffer。

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

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

相关文章

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…

C语言程序设计(二)

四.找素数 素数&#xff1a;除了1和它本身不再有其他因数的自然数。换句话说&#xff1a;一个大于1的自然数 &#xff0c;如果只能被1和它本身整除&#xff0c;那就是素数&#xff08;质数&#xff09;。 在打印中遇到的问题就是&#xff0c;知道怎么写却总是运行不起来。主要…

Python missingno和Vaex库:高性能的大数据分析

在数据分析和处理过程中&#xff0c;数据缺失是常见的问题。处理和理解数据缺失情况是确保数据质量和分析准确性的关键步骤。Python的missingno库提供了一种便捷且直观的方式来可视化数据缺失情况&#xff0c;从而帮助我们更好地理解和处理缺失值。本文将详细介绍missingno库的…

一文看懂:数据产品的3种输出形式和4大服务层次

企业要想提升数据资产的价值&#xff0c;就必须了解数据产品。那么&#xff0c;什么是数据产品&#xff0c;我们该如何认识它&#xff1f; 在由WakeData惟客数据联合星光数智推出的直播栏目《星光对话》第5期中&#xff0c;星光数智首席数据架构师魏战松&#xff0c;分享了对于…

分布式事务解决方案(一) 2PC、3PC、TCC、Sega

目录 1.绪论 2.2PC 2.1 基本原理 2.1.1 组成 2.1.2 步骤 1.prepare阶段 2.commit阶段 2.2 2PC 存在的问题 2.2.1 阻塞问题 2.2.2 单点故障问题 1. 事务协调器宕机 2.部分数据不一致问题 2.资源管理器宕机 3. 事务协调器和资源管理管理器同时宕机 2.2 实现 2.2.1…

JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测(蛇群算法优化)

JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测&#xff08;蛇群算法优化&#xff09; 目录 JCR一区级 | Matlab实现SO-Transformer-LSTM多变量回归预测&#xff08;蛇群算法优化&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】M…

跨网段 IP 地址通信故障分析

现如今计算机网络的规模和复杂性不断增加&#xff0c;跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障&#xff0c;严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…

影响卫星飞行的自然因素和人为因素

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

[tomato]靶机复现漏洞详解!

靶机地址&#xff1a; https://download.vulnhub.com/tomato/Tomato.ova 靶机环境&#xff1a;Vmware 网络&#xff1a;NAT模式 信息收集&#xff1a; arp-scan -l 扫描靶机ip地址 扫描开放的端口信息 nmap -sS -sV -p- 192.168.77.135 发现开放端口21&#xff…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…

LabVIEW汽车动态信号模拟系统

随着汽车工业的快速发展&#xff0c;对汽车电子控制单元&#xff08;ECU&#xff09;的测试与仿真需求日益增加。开发了一种基于LabVIEW软件开发的汽车动态信号模拟系统&#xff0c;该系统能有效模拟ECU在实车环境下的工作状态&#xff0c;为ECU的开发和测试提供了一个高效、经…

2024电赛H题参考方案(+视频演示+核心控制代码)——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、相关模块的移植 4、整体控制方案视频演示 5、视频演示部分核心代码 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&…

C语言:字符串函数、内存函数剖析

字符串函数、内存函数剖析 一、字符串函数&#xff08;一&#xff09;求字符串长度1、strlen&#xff08;1&#xff09;库函数实现&#xff08;2&#xff09;自定义实现 &#xff08;二&#xff09;长度不受限制的字符串函数1、strcpy&#xff08;1&#xff09;库函数实现&…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

CMDB运维管理平台是什么?

CMDB运维管理平台&#xff08;Configuration Management Database&#xff09;是一种致力于帮助企业有效管理和维护IT基础设施信息的工具。 在当今数字化浪潮的推动下&#xff0c;企业对IT系统的需求不断增长&#xff0c;IT基础设施复杂多样&#xff0c;为了有效管理这些系统的…

面试官没想到一个ArrayList,我都能跟他扯半小时

点赞再看&#xff0c;Java进阶一大半 南哥在stackoverflow社区看到14年前的这么一个问题&#xff1a;Java 的 Vector.add() 和 Vector.addElement() 有什么区别&#xff0c;大家有答案吗&#xff1f; 它们实际上没有区别&#xff01;&#xff01;&#xff01;1996年的JDK 1.0版…

大模型微调框架swift简介

Tuners 参数高效调优 内存高效调优

FPGA开发——蜂鸣器的控制

一、概述 在项目开发的过程当中&#xff0c;我会通常会需要一个东西就行报警显示&#xff0c;有使用语音报警&#xff0c;信息报警等注入此类的方式&#xff0c;但最为简单使用的还是蜂鸣器的使用&#xff0c;蜂鸣器控制简单&#xff0c;成本低&#xff0c;是最为常用的模块之…

job任务不执行问题

今天早上有个同事在job服务新增了一个定时任务之后,发现其他所有job任务都停止了. 具体问题为:job任务默认是单线程的, 新增的那个任务为一分钟一次, 一分钟之内任务没有执行完毕, 其他任务为一个阻塞状态,导致服务停止.

【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 前言 上节课完成了里程计数据与坐标变换发布&#xff0c;但是还没有测试&#xff0c;本节进行测试&#xff0c;测试之前需要知道一件事&#xff0c;上位机也就是开发板一般不做可视化用&#xff0c;因…