Java后端使用socketio,实现小程序答题pk功能-程序员宅基地

技术标签: 程序员  java  小程序  开发语言  

*/

@PostConstruct

private void autoStartup() throws Exception {

start();

}

/**

  • Spring IoC容器在销毁SocketIOServiceImpl Bean之前关闭,避免重启项目服务端口占用问题

  • @throws Exception

*/

@PreDestroy

private void autoStop() throws Exception {

stop();

}

public void start() {

// 监听客户端连接,同级挑战比拼

socketIOServer.addConnectListener(client -> {

Long uid = Long.valueOf(getParamsByClient(client));

log.info(“connect come in,uid:{}”,uid);

//0为同级挑战,1为邀请好友pk

int type = 0;

//房间号

int pkId = 0;

//从请求的连接中拿出参数

Map<String, List> params = client.getHandshakeData().getUrlParams();

List list = params.get(“type”);

if (list != null && list.size() > 0) {

type = Integer.valueOf(list.get(0));

}

List list1 = params.get(“pkId”);

if (list1 != null && list1.size() > 0) {

pkId = Integer.valueOf(list1.get(0));

}

if (uid != null) {

if (clientMap.containsKey(uid)) {

log.info(uid + “is reconnect”);

clientMap.remove(uid);

clientMap.put(uid , client);

}else{

clientMap.put(uid, client);

log.info(“clientMap:”+clientMap);

joinSendMessage(uid , client , type , pkId);

}

}

});

// 监听客户端断开连接

socketIOServer.addDisconnectListener(client -> {

Long uid = Long.valueOf(getParamsByClient(client));

log.info(“disconnect come in,uid:{}”,uid);

if (uid != null) {

log.info(“uid is not null come in,uid:{}”,uid);

clientMap.remove(uid);

client.disconnect();

//退出通知对手

Long usrEntId = 0l;

PkGroup pkGroup = pkMapper.getPkGroupUserNewRoom(uid);

if(pkGroup != null){

log.info(“pkGroup is not null come in,uid:{}”,uid);

if(uid == pkGroup.getInviteUsrEntId()){

usrEntId = pkGroup.getAcceptUsrEntId();

}else if(uid == pkGroup.getAcceptUsrEntId()){

usrEntId = pkGroup.getInviteUsrEntId();

}

}

if(usrEntId != null && usrEntId != 0l){

log.info(“usrEntId is not null come in,uid:{}”,uid);

log.info(“socketIOClient usrEntId:” + usrEntId);

JSONObject jsonObject = new JSONObject();

SocketIOClient socketIOClient = clientMap.get(usrEntId);

if(socketIOClient != null){

jsonObject.put(“disconnect” , 1);

socketIOClient.sendEvent(“ClientReceive” , jsonObject);

}

}

if(clientMap.get(usrEntId) == null || usrEntId == null){

if(pkGroup != null){

PkGroup updatePkGroup = pkMapper.getPkGroupById(pkGroup.getId());

updatePkGroup.setState(2);

pkMapper.updatePkGroup(updatePkGroup);

log.info(“disconnect opponent is disconnect,uid:{}”,uid);

}

}

}

log.info(“disconnect is success,uid:{}”,uid);

});

// 处理自定义的事件,与连接监听类似

// 此示例中测试的json收发 所以接收参数为JSONObject 如果是字符类型可以用String.class或者Object.class

socketIOServer.addEventListener(“ServerReceive”,JSONObject.class, (client, data, ackSender) -> {

JSONObject jsonObject = data;

if(data != null){

String uid = jsonObject.getString(“usrEntId”);

String action = jsonObject.getString(“action”);

if(“getAI”.equals(action)){

log.info(“getAI come in,uid:{}”,uid);

//和人机pk返回

botSendMessage(uid , client);

}else if(“challenge”.equals(action)){

log.info(“challenge come in,uid:{}”,uid);

//pk过程中每做一道题返回消息给两个人

int pkId = 0;

if(!“”.equals(jsonObject.getString(“pkId”))){

pkId = Integer.valueOf(jsonObject.getString(“pkId”));

}

if(pkId == 0){

log.info(“challenge pkId is 0”);

return;

}

long usrEntId = -1;

if(!“”.equals(jsonObject.getString(“usrEntId”))){

usrEntId = Long.valueOf(jsonObject.getString(“usrEntId”));

}

if(usrEntId == -1){

log.info(“challenge usrEntId is -1”);

return;

}

int answer = 0;

if(!“”.equals(jsonObject.getString(“answer”))){

answer = Integer.valueOf(jsonObject.getString(“answer”));

}

int time = 0;

if(!“”.equals(jsonObject.getString(“time”))){

time = Integer.valueOf(jsonObject.getString(“time”));

}

int queResId = 0;

if(!“”.equals(jsonObject.getString(“queResId”))){

queResId = Integer.valueOf(jsonObject.getString(“queResId”));

}

int orderNum = 0;

if(!“”.equals(jsonObject.getString(“orderNum”))){

orderNum = Integer.valueOf(jsonObject.getString(“orderNum”));

}

int option = 0;

if(!“”.equals(jsonObject.getString(“option”))){

option = Integer.valueOf(jsonObject.getString(“option”));

}

PkAnswerTime pkAnswerNow = new PkAnswerTime();

pkAnswerNow.setPkGroupId(pkId);

pkAnswerNow.setUsrEntId(usrEntId);

pkAnswerNow.setAnswer(answer);

pkAnswerNow.setTime(time);

pkAnswerNow.setQueResId(queResId);

pkAnswerNow.setOrderNum(orderNum);

pkAnswerNow.setOption(option);

pkMapper.savePkAnswerTime(pkAnswerNow);

PkGroup pkGroup = pkMapper.getPkGroupById(pkId);

if(usrEntId == pkGroup.getInviteUsrEntId()){

long acceptUsrEntId = pkGroup.getAcceptUsrEntId();

judgeWinner(acceptUsrEntId , pkAnswerNow ,client);

}else if(usrEntId == pkGroup.getAcceptUsrEntId()){

long inviteUsrEntId = pkGroup.getInviteUsrEntId();

judgeWinner(inviteUsrEntId , pkAnswerNow ,client);

}

}else if(“again”.equals(action)){

log.info(“again come in”);

//再来一局

int pkId = Integer.valueOf(jsonObject.getString(“pkId”));

log.info(“pkId:”+pkId+“uid:”+uid);

againSendMessage(uid , pkId, client);

}else if(“skill”.equals(action)){

//使用技能

int pkId = Integer.valueOf(jsonObject.getString(“pkId”));

//技能id

int infoId = Integer.valueOf(jsonObject.getString(“info”));

skillSendMessage(uid , pkId , infoId);

}

}

});

socketIOServer.start();

log.info(“socket.io初始化服务完成”);

}

public void stop() {

if (socketIOServer != null) {

socketIOServer.stop();

socketIOServer = null;

}

log.info(“socket.io服务已关闭”);

}

/**

  • 此方法为获取client连接中的参数,可根据需求更改

  • @param client

  • @return

*/

private String getParamsByClient(SocketIOClient client) {

// 从请求的连接中拿出参数(这里的usrEntId必须是唯一标识)

Map<String, List> params = client.getHandshakeData().getUrlParams();

List list = params.get(“usrEntId”);

if (list != null && list.size() > 0) {

return list.get(0);

}

return null;

}

private synchronized void joinSendMessage(long usrEntId , SocketIOClient client , int type , int pkId){

// 给客户端发送一条信息 发送ConnectReceive事件 需要客户端绑定此事件即可接收到消息

JSONObject jsonObject = new JSONObject();

Date date = new Date(new Date().getTime() - 20000);

PkGroup pkGroup = pkMapper.getPkGroupByState(usrEntId , type , date);

if(type != 0 && pkId != 0){

pkGroup = pkMapper.getPkGroupById(pkId);

}

if(type != 0 && pkId == 0){

pkGroup = null;

}

if(pkGroup != null){

pkGroup.setAcceptUsrEntId(usrEntId);

pkGroup.setState(1);

pkMapper.updatePkGroup(pkGroup);

long inviteUsrEntId = pkGroup.getInviteUsrEntId();

WxUserInfo invite = wxUserInfoMapper.queryWxUserInfoByUsrEntId(inviteUsrEntId);

List questions = remyCourseService.listGetRandomTopic(0);

jsonObject.put(“state” , 1);

jsonObject.put(“wxUserInfo” , invite);

jsonObject.put(“questions” , questions);

jsonObject.put(“pkId” , pkGroup.getId());

client.sendEvent(“ConnectReceive”,jsonObject);

SocketIOClient socketIOClient = clientMap.get(inviteUsrEntId);

WxUserInfo accept = wxUserInfoMapper.queryWxUserInfoByUsrEntId(usrEntId);

JSONObject acceptJson = new JSONObject();

acceptJson.put(“state” , 1);

acceptJson.put(“questions” , questions);

acceptJson.put(“pkId” , pkGroup.getId());

acceptJson.put(“wxUserInfo” , accept);

socketIOClient.sendEvent(“ConnectReceive” , acceptJson);

}else{

PkGroup savePkGroup = new PkGroup();

savePkGroup.setInviteUsrEntId(usrEntId);

savePkGroup.setState(0);

savePkGroup.setCreateTime(new Date());

savePkGroup.setType(type);

pkMapper.savePkGroup(savePkGroup);

jsonObject.put(“state” , 0);

jsonObject.put(“pkId” , savePkGroup.getId());

client.sendEvent(“ConnectReceive”,jsonObject);

}

}

private synchronized void botSendMessage(String uid , SocketIOClient client){

JSONObject jsonObject = new JSONObject();

PkGroup pkGroup = pkMapper.getPkGroupByUsrEntIdToAI(Long.valueOf(uid));

if(pkGroup != null){

log.info(“getAI pkGroup is not null come in,uid:{}”,uid);

pkGroup.setAcceptUsrEntId(0l);

pkGroup.setState(1);

pkMapper.updatePkGroup(pkGroup);

List questions = remyCourseService.listGetRandomTopic(0);

jsonObject.put(“state” , 1);

jsonObject.put(“questions” , questions);

jsonObject.put(“pkId” , pkGroup.getId());

client.sendEvent(“AIReceive”,jsonObject);

}

}

private synchronized void judgeWinner(long anotherEntId , PkAnswerTime pkAnswerNow, SocketIOClient client){

log.info(“judgeWinner come in,anotherEntId:{}”,anotherEntId);

int pkId = pkAnswerNow.getPkGroupId();

int orderNum = pkAnswerNow.getOrderNum();

int answer = pkAnswerNow.getAnswer();

int time = pkAnswerNow.getTime();

long usrEntId = pkAnswerNow.getUsrEntId();

int option = pkAnswerNow.getOption();

JSONObject json = new JSONObject();

PkAnswerTime pkAnswerTime = pkMapper.getPkAnswerTimeByParam(anotherEntId , pkId , orderNum);

if(pkAnswerTime != null){

log.info(“judgeWinner pkAnswerTime is not null come in,pkAnswerTime:{}”,pkAnswerTime);

PkGroup pkGroup = pkMapper.getPkGroupById(pkId);

if(orderNum == 5){

pkGroup.setState(2);

pkMapper.updatePkGroup(pkGroup);

}

long winUsrEntId = -1;

if(pkAnswerTime.getAnswer() == 1 && answer == 1){

if(time > pkAnswerTime.getTime()){

winUsrEntId = anotherEntId;

}else if(time < pkAnswerTime.getTime()){

winUsrEntId = usrEntId;

}else{

winUsrEntId = -1;

}

}else if(pkAnswerTime.getAnswer() == 1){

winUsrEntId = anotherEntId;

}else if(answer == 1){

winUsrEntId = usrEntId;

}else{

winUsrEntId = -1;

}

json.put(“winUsrEntId” , winUsrEntId);

json.put(“pkId” , pkId);

json.put(“usrEntId” , anotherEntId);

json.put(“answer” , pkAnswerTime.getAnswer());

json.put(“time” , pkAnswerTime.getTime());

json.put(“option” , pkAnswerTime.getOption());

client.sendEvent(“challengeReceive”,json);

if(anotherEntId != 0){

SocketIOClient socketIOClient = clientMap.get(anotherEntId);

JSONObject acceptJson = new JSONObject();

acceptJson.put(“pkId” , pkId);

acceptJson.put(“usrEntId” , usrEntId);

acceptJson.put(“answer”, answer);

acceptJson.put(“time”, time);

acceptJson.put(“option”,option);

acceptJson.put(“winUsrEntId”,winUsrEntId);

socketIOClient.sendEvent(“challengeReceive” , acceptJson);

}

if(pkGroup.getInviteUsrEntId() == winUsrEntId){

if(pkGroup.getInviteNum() != null){

pkGroup.setInviteNum(pkGroup.getInviteNum() + 1);

}else{

pkGroup.setInviteNum(1);

}

}else if(pkGroup.getAcceptUsrEntId() == winUsrEntId){

if(pkGroup.getAcceptNum() != null){

pkGroup.setAcceptNum(pkGroup.getAcceptNum() + 1);

}else{

pkGroup.setAcceptNum(1);

}

}

pkMapper.updatePkNum(pkGroup);

}

}

private synchronized void againSendMessage(String uid , int pkId , SocketIOClient client){

JSONObject json = new JSONObject();

long usrEntId = Long.valueOf(uid);

PkGroup pkGroup = pkMapper.getPkGroupById(pkId);

log.info(“againSendMessage pkGroup:”+pkGroup);

long opponentId = -1;

if(pkGroup.getAcceptUsrEntId() != null){

if(usrEntId == pkGroup.getAcceptUsrEntId()){

opponentId = pkGroup.getInviteUsrEntId();

}else{

opponentId = pkGroup.getAcceptUsrEntId();

}

}

PkAgainGame pkAgainGame = pkMapper.getPkAgainGame(opponentId , pkId);

log.info(“againSendMessage pkAgainGame:”+pkAgainGame);

if(pkAgainGame == null){

PkAgainGame againGame = new PkAgainGame();

againGame.setCreateTime(new Date());

againGame.setUsrEntId(usrEntId);

againGame.setPkGroupId(pkId);

pkMapper.savePkAgainGame(againGame);

json.put(“usrEntId” , usrEntId);

json.put(“state” , 0);

SocketIOClient socketIOClient = clientMap.get(opponentId);

log.info(“againSendMessage socketIOClient:”+socketIOClient);

socketIOClient.sendEvent(“AgainReceive” , json);

}else{

pkAgainGame.setOpponentUsrEntId(usrEntId);

pkMapper.updatePkAgainGame(pkAgainGame);

//创建房间

PkGroup savePkGroup = new PkGroup();

savePkGroup.setAcceptUsrEntId(usrEntId);

savePkGroup.setInviteUsrEntId(opponentId);

savePkGroup.setState(1);

savePkGroup.setCreateTime(new Date());

savePkGroup.setType(pkGroup.getType());

pkMapper.savePkGroup(savePkGroup);

List questions = remyCourseService.listGetRandomTopic(0);

log.info(“againSendMessage questions:”+questions);

json.put(“state” , 1);

json.put(“questions” , questions);

json.put(“pkId” , savePkGroup.getId());

if(opponentId == 0){

json.put(“wxUserInfo” , “”);

}else{

WxUserInfo invite = wxUserInfoMapper.queryWxUserInfoByUsrEntId(opponentId);

json.put(“wxUserInfo” , invite);

}

client.sendEvent(“AgainReceive”,json);

if(opponentId != 0 && opponentId != -1){

SocketIOClient socketIOClient = clientMap.get(opponentId);

JSONObject acceptJson = new JSONObject();

acceptJson.put(“state” , 1);

acceptJson.put(“questions” , questions);

acceptJson.put(“pkId” , savePkGroup.getId());

WxUserInfo accept = wxUserInfoMapper.queryWxUserInfoByUsrEntId(usrEntId);

acceptJson.put(“wxUserInfo” , accept);

log.info(“againSendMessage socketIOClient:”+socketIOClient);

socketIOClient.sendEvent(“AgainReceive” , acceptJson);

}

}

}

private void skillSendMessage(String uid , int pkId , int infoId){

JSONObject json = new JSONObject();

long usrEntId = Long.valueOf(uid);

PkGroup pkGroup = pkMapper.getPkGroupById(pkId);

log.info(“skillSendMessage pkGroup:”+pkGroup);

long opponentId = -1;

if(usrEntId == pkGroup.getAcceptUsrEntId()){

opponentId = pkGroup.getInviteUsrEntId();

}else{

opponentId = pkGroup.getAcceptUsrEntId();

}

json.put(“usrEntId” , usrEntId);

json.put(“skill” , 1);

json.put(“info” , infoId);

SocketIOClient socketIOClient = clientMap.get(opponentId);

log.info(“skillSendMessage socketIOClient:”+socketIOClient);

socketIOClient.sendEvent(“SkillReceive” , json);

}

}

二、遇到的一些问题

==========

1、最初在发送消息给两人时,有个人能收到消息,有个人收不到
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**[外链图片转存中…(img-L0HbeTHw-1711985524547)]

[外链图片转存中…(img-Z3F8qyBC-1711985524548)]

[外链图片转存中…(img-o8qlfJBX-1711985524548)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

[外链图片转存中…(img-QYYDMVaA-1711985524549)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_83703835/article/details/137250585

智能推荐

QGIS基本功| 8 初识数据源_qgis qml-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏10次。初次接触GIS的朋友,常常弄不清数据源(Data Source)和图层(Layer)的区别与联系,导致在数据处理和分发时出现一些问题,例如:辛辛苦苦做出了一幅漂亮的地图,为什么再次打开数据时,地图又变回丑陋的样子?怎么才能把工作成果分发给同事,让他打开数据时效果跟我本机一模一样?回答这些问题,我们需要从数据源的基本概念说起。本文从数据源和图层的区别与联系、打开数据源管理器、数据源管理器界面介绍和QGIS支持打开的数据源类型等方面,整体上初步介绍数据源相关知识。后续将陆续推出文章,详细介绍.._qgis qml

kaldi yesorno案例学习记录_local/prepare_lm.sh: line 7: 19989-程序员宅基地

文章浏览阅读270次。学习自Kaldi-yesno详解先来学习run.sh脚本#!/bin/bashtrain_cmd=“utils/run.pl”decode_cmd=“utils/run.pl”#-d filename 判断filename是否为目录,是为真,即下面的是如果waves_yesorno部署目录,去网站下载,||逻辑或,如果前面的语句执行成功,后面的就不执行了,如果前面的出问题,就异常退出(exit 0 代表正常运行程序并退出程序,exit 1 代表非正常运行导致退出程序。其实目的就是: 程序退出后, _local/prepare_lm.sh: line 7: 19989

《专题五 容器化微服务》之《第三章 云原生DevOps》之《第二节 监控》-程序员宅基地

文章浏览阅读181次。我:es的index类似kafka的topic, es的shard类似kafka的partition,副本类似kafka的副本(除了es当有多个请求需要访问同一个index时,各shard的多副本上可并行搜索;相比之下,kafka的partition只能分配给一个消费者组里的一个消费者)20:40 filebeat对k8s的支持:通过监听k8s事件,自动采集容器的标准输出。10 30+ 容器与Kubernetes里的日志,与传统主机模式下的日志有较大区别。13 55+ Filebeat采集容器化日志。

一文带你快速了解业务流程分析和流程建模_系统业务流程介绍与分析-程序员宅基地

文章浏览阅读2.2k次。有哪些业务流程?业务流程如何完成?业务流程有谁参与?流程中有哪些控制流(如判断、同步分支和会合)?多个不同流程建的关系?完成流程所用的资源等。_系统业务流程介绍与分析

nmos导通流向_MOS管-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏14次。MOS管P管。通常S接电源。G控制信号,D接负载。当G等于S时。S和D不导通当G小于一定S D和S导通。N管S接地,G接控制,D接电流节点1. MOS管开关电路学习过模拟电路的人都知道三极管是流控流器件,也就是由基极电流控制集电极与发射极之间的电流;而MOS管是压控流器件,也就是由栅极上所加的电压控制漏极与源极之间电流。MOSFET管是FET的一种,可以被制造为增强型或者耗尽型,P沟道或N沟道共四..._nmos导通

2024年Vue最常见的面试题以及答案(面试必过),数据结构与算法面试题及答案_面试题 vue 数结构数据怎么组合-程序员宅基地

文章浏览阅读636次,点赞13次,收藏9次。基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。_面试题 vue 数结构数据怎么组合

随便推点

linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;_linux按照mysql数据库配置表名不区分大小写-程序员宅基地

文章浏览阅读1.2k次。1、linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写; 2、用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写; lower_case_table_names参数详解: lower_case_table_names = 0 其_linux按照mysql数据库配置表名不区分大小写

关于JAVA核心技术(卷一)读后的思考(接口的基本知识的讨论)-程序员宅基地

文章浏览阅读118次。接口接口技术:这种技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现。一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口对象。接口概念:接口不是类,而是对类的一组需求的描述,这些类要遵从接口描述的统一格式进行定义。举个简单的例子:假设有一个类A,其中有一个sort方法是对对象数组进行排序,但要求对象所属的类必须实现了 B接口。假设B接口定义如下..._接口的定义中,对接口的域和方法有什么要求

torch.split()-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏9次。所以,torch.split()是一个很有用的函数,可以轻松地将张量分割成任意形状和大小的张量列表,以用于后续处理。官网解释:Splits the tensor into chunks.——PyTorch中用于分割张量的函数。官网链接:https://pytorch.org/docs/stable/torch.html。作用:将一个多维张量分割成多个张量。_torch.split

2022年最新一篇文章教你青龙面板拉库,拉取单文件,安装依赖,设置环境变量,解决没有或丢失依赖can‘t find module之保姆教程(附带几十个青龙面板脚本仓库)_cannot find module 'ds-程序员宅基地

文章浏览阅读8.7w次,点赞29次,收藏441次。没有安装青龙面板的先看我另外一篇教程https://blog.csdn.net/qq_39997540/article/details/122363463?spm=1001.2014.3001.55011.青龙面板拉库打开浏览器进入按照我的主页里的另一篇教程安装好的青龙面板,点击右上角的添加任务编辑任务 1 0-23/1 * * *点击你添加好的拉库任务右边的运行按钮,过几分钟你要拉的库就下载到你的青龙面板了2.分享收集的青龙面板脚本仓库,建议选择拉一个就可以了1.JB库._cannot find module 'ds

hive 报错FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoo_hiveexception java.lang.runtimeexception: unable t-程序员宅基地

文章浏览阅读1.8k次。使用hive一段时间以后,今天在使用的时候突然报错,如下:hive> show databases;FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClientFAILED: Execu_hiveexception java.lang.runtimeexception: unable to instantiate org.apache.h

Python-爬虫(三):爬虫背景的系统性整理——HTML与正则_爬虫 html正则-程序员宅基地

文章浏览阅读317次。爬虫背景的系统性整理一、简单回顾网页结构1、查看网页源代码(1)浏览器选择Chrome 谷歌:本人首选Firefox 火狐:可查看 utf-8 编码中文,并且在源代码界面已排版(2)如何呼出:方法一:右击 - 查看源代码(静态构架)方法二:F12 或 设置-开发者工具 或 右击-检查(动态构架-即能够看到渲染后信息)(3)重点关注什么:【选择】按钮,即左上角的鼠标按钮【Elements】选项卡,即 html 原文与各可直接调试的元素,按多级目录排列小应用:可以删除广_爬虫 html正则

推荐文章

热门文章

相关标签