前言

移动社交是我们日常生活中很常见的软件,最近在做即时通信,我用的是环信,和大家分享一下~~

环信的API都是基于JSON的,所以在构造HTTP请求的时候,要指定请求头:

注意==》环信API必须携带token才可以访问。

创建一个认证类

public class Authentic {

private static Token token = new Token();

private TalkHttpService service;

public Authentic(TalkHttpService service) {

this.service = service;

}

public Authentic(TalkHttpService service, Token token) {

this.service = service;

if (token != null) {

Authentic.token = token;

}

}

public Token getToken() {

this.flush();

return token;

}

public void task() {

this.flush();

}

/**

* @describe 申请认证 POST PUT 这两种请求携带参数

* @author 何章怀晓 hezhanghuaixiao

* @date 2020/9/8 17:02

* @other

*/

public void applyAuthentication(HttpEntityEnclosingRequestBase request) {

this.flush();

request.addHeader("Authorization", "Bearer " + token.toString());

}

/**

* @describe 申请认证 GET DELETE 这两种请求不携带参数

* @author 何章怀晓 hezhanghuaixiao

* @date 2020/9/8 17:02

* @other

*/

public void applyAuthentication(HttpRequestBase request) {

this.flush();

request.addHeader("Authorization", "Bearer " + token.toString());

}

private void flush() {

synchronized (Authentic.class) {

try {

//如果超时

if (token.isExpire()) {

//判断APPID和秘钥信息

if (_Global.APP_CLIENT_ID != null && _Global.APP_CLIENT_SECRET != null) {

Map param = new HashMap();

param.put("grant_type", "client_credentials");

param.put("client_id", _Global.APP_CLIENT_ID);

param.put("client_secret", _Global.APP_CLIENT_SECRET);

//请求获取token

TalkNode res = service

.request(_Global.URR_TOKEN, _Global.HTTP_METHOD_POST, param, null, null);

//成功获取token

if (res != null && res.getAccess_token() != null && res.getExpires_in() != null

&& res.getExpires_in() > 0) {

//赋值

token = new Token(res.getAccess_token(),

res.getExpires_in() * 1000 + System.currentTimeMillis());

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

public static class Token {

private String token;

private Long expire;

public Token() {

}

public Token(String token, long expire) {

this.token = token;

this.expire = expire;

}

public String getToken() {

return token;

}

public void setToken(String token) {

this.token = token;

}

public Long getExpire() {

return expire;

}

public void setExpire(Long expire) {

this.expire = expire;

}

public boolean isExpire() {

return expire == null || System.currentTimeMillis() > expire;

}

@Override

public String toString() {

return token;

}

}

}

创建请求接口

public interface TalkHttpService {

/**

@describe

@param

* @param url 请求地址

* @param method请求方法

* @param param参数

* @param auth加密认证

* @param field字段转换

@return com.hedashi.protal.model.TalkNode

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:21

@other

*/

TalkNode request(String url, int method, Object param,

Authentic auth, String[][] field) throws Exception;

/**

@describe

@param

* @param url 请求地址

* @param file文件名称

* @param auth加密认证

* @param equal字段转换

@return com.hedashi.protal.model.TalkNode

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:21

@other

*/

TalkNode upload(String url, File file, Authentic auth,

String[][] equal) throws Exception;

/**

@describe

@param

* @param url 请求地址

* @param file文件名称

* @param auth加密认证

* @param header请求头

@return void

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:21

@other

*/

void downLoad(String url, File file, Authentic auth,

Map header) throws Exception;

}

创建全局变量对不同模块操作

/*

@describe 全局变量

@params

@return

@author 何章怀晓

@date 2020/7/30 9:30

@other

*/

public class _Global {

public static String APP_KEY = "";

public static String APP_CLIENT_ID = "";

public static String APP_CLIENT_SECRET = "";

//每页数量

public static int APP_PAGE_SIZE = 10;

public static final int HTTP_METHOD_GET = 1;

public static final int HTTP_METHOD_POST = 2;

public static final int HTTP_METHOD_PUT = 3;

public static final int HTTP_METHOD_DELETE = 4;

public static final String URL_HOST = "http://a1.easemob.com/"+APP_KEY.replace("#","/")+"/";

public static final String URR_TOKEN = URL_HOST+"token";

public static final String URL_CHAT = URL_HOST+"chatmessages";

public static final String URL_GROUP = URL_HOST+"chatgroups";

public static final String URL_FILE = URL_HOST+"chatfiles";

public static final String URL_ROOM = URL_HOST+"chatrooms";

public static final String URL_MESSAGES = URL_HOST+"messages";

public static final String URL_USER = URL_HOST+"users";

}

请求管理类

package com.hedashi.protal.service.impl;

import com.hedashi.protal.model.TalkNode;

import com.hedashi.protal.model.Authentic;

import com.hedashi.protal.service.TalkHttpService;

import com.hedashi.protal.util.JsonTool;

import com.hedashi.protal.util._Global;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.URI;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.HttpStatus;

import org.apache.http.client.methods.HttpDelete;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.methods.HttpPut;

import org.apache.http.entity.StringEntity;

import org.apache.http.entity.mime.MultipartEntity;

import org.apache.http.entity.mime.content.ContentBody;

import org.apache.http.entity.mime.content.FileBody;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

import org.springframework.stereotype.Service;

@Service

public class TalkHttpServiceImplApache implements TalkHttpService {

/**

@describe

@param

* @param url 请求路径

* @param method 方式

* @param param 参数

* @param auth 认证

* @param field 将相应结果封装到本地

@return com.hedashi.protal.model.TalkNode

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:39

@other

*/

@Override

public TalkNode request(String url, int method, Object param,

Authentic auth, String[][] field) throws Exception {

//获得可关闭的连接

CloseableHttpClient client = this.getClient();

try {

HttpResponse response = null;

//区分请求方式

switch (method) {

case _Global.HTTP_METHOD_GET:

//构建请求

HttpGet get = new HttpGet(url);

if (auth != null) {

//如果未认证 请求认证

auth.applyAuthentication(get);

}

//固定请求头信息为JSON

get.addHeader("Content-Type", "application/json");

response = client.execute(get);

break;

case _Global.HTTP_METHOD_POST:

HttpPost post = new HttpPost(url);

if (auth != null) {

auth.applyAuthentication(post);

}

//POST携带参数

if (param != null) {

//参数编码放入请求体

post.setEntity(new StringEntity(JsonTool.write(param),

"UTF-8"));

}

post.addHeader("Content-Type", "application/json");

response = client.execute(post);

break;

case _Global.HTTP_METHOD_PUT:

HttpPut put = new HttpPut(url);

if (put != null) {

auth.applyAuthentication(put);

}

if (param != null) {

put.setEntity(new StringEntity(JsonTool.write(param),

"UTF-8"));

}

put.addHeader("Content-Type", "application/json");

response = client.execute(put);

break;

case _Global.HTTP_METHOD_DELETE:

HttpDelete delete = new HttpDelete(url);

if (auth != null) {

auth.applyAuthentication(delete);

}

delete.addHeader("Content-Type", "application/json");

response = client.execute(delete);

break;

default:

throw new Exception("非法请求方式");

}

int code = response.getStatusLine().getStatusCode();

//判断返回code 如果为200

if (code == HttpStatus.SC_OK) {

//获取响应体

HttpEntity entity = response.getEntity();

if (entity != null) {

//解析

String json = EntityUtils.toString(entity, "UTF-8");

if (field != null && field.length > 0) {

for (String[] temp : field) {

json = json.replace(temp[0], temp[1]);

}

}

//解析为实体类

TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);

talkNode.setStatusCode(code);

return talkNode;

}

} else {

//非200将code返回

return new TalkNode(code);

}

} catch (Exception e) {

throw e;

} finally {

client.close();

}

return null;

}

@Override

public TalkNode upload(String url, File file, Authentic auth,

String[][] equal) throws Exception {

CloseableHttpClient client = this.getClient();

try {

HttpPost post = new HttpPost();

post.setURI(new URI(url));

if (auth != null) {

auth.applyAuthentication(post);

}

post.addHeader("restrict-access", "true");

ContentBody body = new FileBody(file);

MultipartEntity part = new MultipartEntity();

part.addPart("file", body);

post.setEntity(part);

HttpResponse response = client.execute(post);

int code = response.getStatusLine().getStatusCode();

if (code == HttpStatus.SC_OK) {

HttpEntity entity = response.getEntity();

if (entity != null) {

String json = EntityUtils.toString(entity, "UTF-8");

if (equal != null && equal.length > 0) {

for (String[] temp : equal) {

json = json.replace(temp[0], temp[1]);

}

}

TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);

talkNode.setStatusCode(code);

return talkNode;

}

}

} catch (Exception e) {

throw e;

} finally {

client.close();

}

return null;

}

@Override

public void downLoad(String url, File file, Authentic auth,

Map header) throws Exception {

CloseableHttpClient client = this.getClient();

try {

HttpGet get = new HttpGet();

get.setURI(new URI(url));

if (auth != null) {

auth.applyAuthentication(get);

}

for (Entry en : header.entrySet()) {

get.addHeader(en.getKey(), en.getValue());

}

HttpResponse response = client.execute(get);

if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

HttpEntity entity = response.getEntity();

if (entity != null) {

InputStream in = entity.getContent();

FileOutputStream fos = new FileOutputStream(file);

byte[] data = new byte[10 * 1024];

int len = 0;

while ((len = in.read(data)) != -1) {

fos.write(data, 0, len);

}

fos.flush();

fos.close();

in.close();

}

}

} catch (Exception e) {

throw e;

} finally {

client.close();

}

}

private CloseableHttpClient getClient() {

return HttpClients.createDefault();

}

}

创建业务请求和响应格式类

package com.hedashi.protal.model;

import java.util.List;

import java.util.Map;

/**

@describe 根据不同的业务封装不同的返回结果,该格式在发送请求的时候就被指定

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:42

@other

*/

public class TalkNode {

public static final String[][] DATA_ENTITIES = new String[][]{{"entities", "entities_share"},

{"share-secret", "share_secret"}};

public static final String[][] DATA_ARRAY = new String[][]{{"data", "data_array"}};

public static final String[][] DATA_LIST = new String[][]{{"data", "data_list"}};

public static final String[][] DATA_MAP = new String[][]{{"data", "data_map"}};

public static final String[][] DATA_CHAT_LIST = new String[][]{{"entities", "data_chat_list"}};

public static final String[][] DATA_ROOM = new String[][]{{"data", "data_room"}};

public static final String[][] DATA_ROOM_LIST = new String[][]{{"data", "data_room_list"},

{"public", "public_room"}};

public static final String[][] DATA_ROOM_REDO = new String[][]{{"data", "data_room_rodo"}};

public static final String[][] DATA_ROOM_REDO_LIST = new String[][]{

{"data", "data_room_redo_list"}};

public static final String[][] DATA_GROUP = new String[][]{{"data", "data_group"}};

public static final String[][] DATA_GROUP_UPDATE = new String[][]{{"data", "data_group_update"}};

public static final String[][] DATA_GROUP_OWNER = new String[][]{{"data", "data_group_owner"}};

public static final String[][] DATA_GROUP_LIST = new String[][]{{"data", "data_group_list"}};

public static final String[][] DATA_GROUP_LIST_MEMBER = new String[][]{

{"data", "data_group_list_member"}};

public static final String[][] DATA_GROUP_LIST_NEW = new String[][]{

{"data", "data_group_list_new"}, {"public", "public_group"}};

public static final String[][] DATA_GROUP_FRIEND = new String[][]{{"data", "data_group_friend"}};

public static final String[][] DATA_GROUP_FRIEND_LIST = new String[][]{

{"data", "data_group_friend_list"}};

private String access_token;

private String action;

private String application;

private String applicationName;

private Long count;

private String cursor;

private Integer duration;

private Long expires_in;

private String organization;

private String path;

private Integer statusCode;

private Long timestamp;

private String uri;

private Map params;

private TalkUser user;

private List entities;

private String[] data_array;

private Map data_map;

private List> data_list;

private List data_chat_list;

private TalkRoom data_room;

private List data_room_list;

private TalkRoomRedo data_room_rodo;

private List data_room_redo_list;

private TalkGroup data_group;

private TalkGroupMember data_group_update;

private TalkGroupMember data_group_owner;

private List data_group_list;

private List data_group_list_member;

private List data_group_list_new;

private TalkGroupFriend data_group_friend;

private List data_group_friend_list;

public TalkNode() {

}

public TalkNode(Integer statusCode) {

this.statusCode = statusCode;

}

public String getAccess_token() {

return access_token;

}

public void setAccess_token(String access_token) {

this.access_token = access_token;

}

public String getAction() {

return action;

}

public void setAction(String action) {

this.action = action;

}

public String getApplication() {

return application;

}

public void setApplication(String application) {

this.application = application;

}

public String getApplicationName() {

return applicationName;

}

public void setApplicationName(String applicationName) {

this.applicationName = applicationName;

}

public Long getCount() {

return count;

}

public void setCount(Long count) {

this.count = count;

}

public String getCursor() {

return cursor;

}

public void setCursor(String cursor) {

this.cursor = cursor;

}

public Integer getDuration() {

return duration;

}

public void setDuration(Integer duration) {

this.duration = duration;

}

public Long getExpires_in() {

return expires_in;

}

public void setExpires_in(Long expires_in) {

this.expires_in = expires_in;

}

public String getOrganization() {

return organization;

}

public void setOrganization(String organization) {

this.organization = organization;

}

public String getPath() {

return path;

}

public void setPath(String path) {

this.path = path;

}

public Integer getStatusCode() {

return statusCode;

}

public void setStatusCode(Integer statusCode) {

this.statusCode = statusCode;

}

public Long getTimestamp() {

return timestamp;

}

public void setTimestamp(Long timestamp) {

this.timestamp = timestamp;

}

public String getUri() {

return uri;

}

public void setUri(String uri) {

this.uri = uri;

}

public Map getParams() {

return params;

}

public void setParams(Map params) {

this.params = params;

}

public TalkUser getUser() {

return user;

}

public void setUser(TalkUser user) {

this.user = user;

}

public List getEntities() {

return entities;

}

public void setEntities(List entities) {

this.entities = entities;

}

public String[] getData_array() {

return data_array;

}

public void setData_array(String[] data_array) {

this.data_array = data_array;

}

public Map getData_map() {

return data_map;

}

public void setData_map(Map data_map) {

this.data_map = data_map;

}

public List> getData_list() {

return data_list;

}

public void setData_list(List> data_list) {

this.data_list = data_list;

}

public List getData_chat_list() {

return data_chat_list;

}

public void setData_chat_list(List data_chat_list) {

this.data_chat_list = data_chat_list;

}

public TalkRoom getData_room() {

return data_room;

}

public void setData_room(TalkRoom data_room) {

this.data_room = data_room;

}

public List getData_room_list() {

return data_room_list;

}

public void setData_room_list(List data_room_list) {

this.data_room_list = data_room_list;

}

public TalkRoomRedo getData_room_rodo() {

return data_room_rodo;

}

public void setData_room_rodo(TalkRoomRedo data_room_rodo) {

this.data_room_rodo = data_room_rodo;

}

public List getData_room_redo_list() {

return data_room_redo_list;

}

public void setData_room_redo_list(List data_room_redo_list) {

this.data_room_redo_list = data_room_redo_list;

}

public TalkGroup getData_group() {

return data_group;

}

public void setData_group(TalkGroup data_group) {

this.data_group = data_group;

}

public TalkGroupMember getData_group_update() {

return data_group_update;

}

public void setData_group_update(TalkGroupMember data_group_update) {

this.data_group_update = data_group_update;

}

public TalkGroupMember getData_group_owner() {

return data_group_owner;

}

public void setData_group_owner(TalkGroupMember data_group_owner) {

this.data_group_owner = data_group_owner;

}

public List getData_group_list() {

return data_group_list;

}

public void setData_group_list(List data_group_list) {

this.data_group_list = data_group_list;

}

public List getData_group_list_member() {

return data_group_list_member;

}

public void setData_group_list_member(

List data_group_list_member) {

this.data_group_list_member = data_group_list_member;

}

public List getData_group_list_new() {

return data_group_list_new;

}

public void setData_group_list_new(List data_group_list_new) {

this.data_group_list_new = data_group_list_new;

}

public TalkGroupFriend getData_group_friend() {

return data_group_friend;

}

public void setData_group_friend(TalkGroupFriend data_group_friend) {

this.data_group_friend = data_group_friend;

}

public List getData_group_friend_list() {

return data_group_friend_list;

}

public void setData_group_friend_list(

List data_group_friend_list) {

this.data_group_friend_list = data_group_friend_list;

}

}

工具类

public class HuanXinUtil {

private static TalkDataService service = null;

/**

@describe 初始化

@param

* @param

@return void

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:26

@other

*/

private static void init(){

if(service == null){

// 初始服务端Token

Authentic.Token token = new Authentic(new TalkHttpServiceImplApache()).getToken();

//token和过期时间

Authentic.Token TEST_TOKEN = new Authentic.Token(token.getToken(),token.getExpire());

//新建一个链接服务

service = new TalkDataServiceImpl(new TalkHttpServiceImplApache());

// 修改数据业务Token

service.setToken(TEST_TOKEN);

}

}

/**

@describe 添加管理员

@param

* @param groupId 群组id

* @param userid 管理员id

@return boolean

@author 何章怀晓 hezhanghuaixiao

@date 2020/9/8 17:54

@other

*/

public static boolean addGroupManager(String groupId,String userid) {

try {

init();

TalkNode talkNode = service.addGroupManager(groupId,userid);

if(talkNode.getStatusCode()==200){

return true;

}

} catch (Exception e) {

e.printStackTrace();

}

return false;

}

}

service调用

@Override

public TalkNode addGroupManager(String id, String userId) throws Exception {

Map param = new HashMap();

param.put("newadmin", userId);

return service.request(_Global.URL_GROUP + "/" + id + "/admin",

_Global.HTTP_METHOD_POST, param, auth, TalkNode.DATA_GROUP);

}

/**

* @param [groupId, managerId]

* @return com.hedashi.common.api.CommonResult

* @describe 后台添加群组管理员

* @author 何章怀晓 hezhanghuaixiao

* @date 2020/9/8 14:28

* @other

*/

@Override

public CommonResult addGroupManager(String groupId, String managerId) {

boolean b = HuanXinUtil.addGroupManager(groupId, managerId);

if(b){

System.out.println("环信添加管理员成功==========================");

//本地添加管理员

addGroupAdmin(groupId,managerId);

return CommonResult.success("SUCCESS");

}

return CommonResult.failed("FAILED");

}

@ApiOperation(value = "群组添加管理员")

@RequestMapping(value = "/addGroupManager", method = RequestMethod.POST)

@ResponseBody

public CommonResult addGroupManager(

@RequestParam @ApiParam(value = "群组环信ID", required = true) String groupId,

@RequestParam @ApiParam(value = "管理员环信id", required = true) String managerId

) {

return heUGroupService.addGroupManager(groupId,managerId);

}

swagger调用

token 信息

{“application”:“53e3eeb5-6926-46dd-bc61-4e214342ef7e”,“access_token”:“YWMtXDS-uPG6EeqItFktBQxljAAAAAAAAAAAAAAAAAAAAAFT4-61aSZG3bxhTiFDQu9-AgMAAAF0bSppWwBPGgBXDkgrlvguBLEe966D_LnbgNyNz2OOsTgP4okhQGoOdA”,“expires_in”:5184000}

swagger返回结果

控制台

数据库:

总结

到此这篇关于java实现即时通信的文章就介绍到这了,更多相关java实现即时通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java即时通讯_java实现即时通信的完整步骤分享相关推荐

  1. 仿微信 java IM即时通讯 | uni-app IM即时通讯 | vue IM即时通讯桌面端 | 源码出售

    仿微信 uniapp IM 即时通讯 源码 & 即时通讯知识小科普 源码,不加密,方便二开! 私有云服务,高效稳定,数据安全,无第三方服务 拓展性强,可拓展任意的消息体类型! 性能优秀,资源足 ...

  2. 即时通讯源码-即时通讯集群服务免费-通讯百万并发技术-Openfire 的安装配置教程手册-哇谷即时通讯集群方案-哇谷云-哇谷即时通讯源码

    即时通讯源码-即时通讯集群服务免费-通讯百万并发技术-Openfire 的安装配置教程手册-哇谷即时通讯集群方案-哇谷云 1,openfire开发环境配置 很久没有写点东西了.最近很烦心,领导不给力. ...

  3. Android即时通讯--仿QQ即时聊天:(一)初识Socket

    1.即时通讯简介 即时通讯(Instant Messaging,简称IM)是一个终端服务,允许两人或者多人通过网络即时传递文字讯息.档案.语音等.简单的概括就是发送消息时,只要对方在线,就能立即接收到 ...

  4. 即时通讯:IM即时通讯实现原理

    即时通讯:IM即时通讯实现原理 IM技术概念 即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种 ...

  5. java工程 p2p通讯_java实现P2P通信-Go语言中文社区

    区块链中的消息传播离不p2p通信 java实现一个简单的p2p通信demo 工具:   idea   jdk1.8   maven 1  :  idea新建maven项目,导入p2p所需要的jar包 ...

  6. java 线程通讯_java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  7. 企业即时通讯软件2013 即时通讯大手笔

    今天的当我走进家门时的即时通讯软件,我听了,立刻我的心里浮现出了一种酸酸的味道,我有一颗牙齿摇得很历害,没有声音,光感动而不熟悉,在最后一次努力很形而上学的即时通讯软件那种后,光熟悉而不感动,口水也不 ...

  8. java socket通讯_Java socket通讯实现过程及问题解决

    这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是 ...

  9. java打开浏览器_Java调用浏览器打开网页完整实例

    这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下 本文实例讲述了Java调用浏览器打开网页的方法.分享给大家供大家参考.具体实现 ...

  10. java 及时编译_Java 面试-即时编译( JIT )

    当我们在写代码时,一个方法内部的行数自然是越少越好,这样逻辑清晰.方便阅读,其实好处远不止如此,通过即时编译,甚至可以提高执行时的性能,今天就让我们好好来了解一下其中的原理. 简介 当 JVM 的初始 ...

最新文章

  1. 转:JAVA常见错误处理方法 和 JVM内存结构
  2. 15.2 java中迭代器的注意事项
  3. 1.2.5 计算机系统的多级层次结构(硬联逻辑级、微程序级、传统机器级、操作系统级、汇编语言级、高级语言级、应用语言级)
  4. 4.Hadoop的学习(Hadoop的安装及环境变量的配置)
  5. SAP CRM webclient ui里直接编写原生的JavaScript
  6. 具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian
  7. Bugfree实用心得_转
  8. 微型计算机的字节取决于什么的宽度,计算机的字长取决于什么?
  9. idea java 非法字符_IDEA提示非法字符,你不懂的UTF-8
  10. 美国邮轮旅行社Cruise Travel Outlet接受加密货币支付
  11. rust笔记12 单元测试
  12. 记OC迁移至swift中笔记20tips
  13. PHP_框架储备资料
  14. 想做个磁力链搜索引擎 3
  15. Unable to load script code in VisualGuidance.The script will not be used until the error 的错误的解决方法
  16. java html模板隐情mini,HTML A标签简单问题
  17. matlab 对曲线积分,matlab计算曲线积分并画出积分曲线
  18. 29、ZigBee 开发教程之基础篇—RFID 射频卡
  19. 神经网络——实现MNIST数据集的手写数字识别
  20. 2020莱斯大学计算机全球排名,2020年莱斯大学QS世界排名

热门文章

  1. Postman如何设置为中文
  2. 计算机视觉论文-2021-07-14
  3. 关闭WINDOWS文件保护功能
  4. CE修改植物大战僵尸
  5. 自学单片机怎么买开发板?
  6. 神经网络计算棒有什么用,神经网络计算棒怎么用
  7. 神经计算棒python_Intel 最新的神经元计算棒Movidius Neural Compute Stick能干什么 ?
  8. 手把手教你如何做一套utm广告投放
  9. 北京东方时尚学车日志
  10. 【毕业设计】深度学习垃圾分类系统 - python 卷积神经网络