百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

03_tomcat 通过 websocket 实现一个简易聊天室功能-项目-教程(三)

suiw9 2024-11-04 15:28 28 浏览 0 评论

03_tomcat 通过 websocket 实现一个简易的聊天室功能-项目-教程(三)

## 一、Tomcat专题 - WebSocket - 案例 - OnMessage分析

### 1、WebSocket DEMO 案例 实现流程分析:OnMessage 分析

### 2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onMessage(String message, Session session) {...} 方法。分析流程。

```bash

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}

@OnMessage

public void onMessage(String message, Session session) {


//1. 获取客户端的信息内容, 并解析


//2. 判定是否有接收人


//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息


//4. 不是all , 则给指定的用户推送消息


}

```

## 二、Tomcat专题 - WebSocket - 案例 - OnMessage功能实现

### 1、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

完成 onMessage(String message, Session session) {...} 方法代码编写。

```bash

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}

@OnMessage

public void onMessage(String message, Session session) throws IOException {

System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );

//1. 获取客户端的信息内容, 并解析

Map<String,String> messageMap = JSON.parseObject(message, Map.class);

String fromName = messageMap.get("fromName");

String toName = messageMap.get("toName");

String content = messageMap.get("content");

//2. 判定是否有接收人

if(toName == null || toName.isEmpty()){

return;

}

//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息

String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);

System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);

if("all".equals(toName)){

//3.1 组装消息内容

broadcastAllUsers(messageContent);

}else{//4. 不是all , 则给指定的用户推送消息

singlePushMessage(messageContent, fromName,toName);

}

}

```

### 2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 //给指定用户推送消息 private void singlePushMessage(String content, String fromName, String toName) throws IOException {...} 方法,并完成代码编写。

```bash

//给指定用户推送消息

private void singlePushMessage(String content, String fromName, String toName) throws IOException {

boolean isOnline = false;

//1. 判定当然接收人是否在线

for (HttpSession hsession : onlineUsers.keySet()) {

if(toName.equals(hsession.getAttribute("username"))){

isOnline = true;

}

}

//2. 如果存在, 发送消息

if(isOnline){

for (HttpSession hsession : onlineUsers.keySet()) {

if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){

onlineUsers.get(hsession).session.getBasicRemote().sendText(content);

}

}

}

}

```

### 3、项目 dzs168_chat_room 中,websocket 类 ChatSocket.java 代码。

```bash

/**

* project_tomcat\dzs168_chat_room\src\djh\it\websocket\ChatSocket.java

*

* 2024-9-2 创建 websocket 类 ChatSocket.java

*/

package djh.it.websocket;

import djh.it.utils.MessageUtil;

import com.alibaba.fastjson.JSON;

import javax.servlet.http.HttpSession;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

@ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class )

public class ChatSocket {

private Session session;

private HttpSession httpSession;

//保存当前系统中登录的用户的HttpSession信息, 及对应的Endpoint实例信息

private static Map<HttpSession , ChatSocket> onlineUsers = new HashMap<HttpSession, ChatSocket>();

private static int onlineCount = 0;

@OnOpen

public void onOpen(Session session, EndpointConfig config){

//1. 记录webSocket的会话信息对象Session

this.session = session;

//2. 获取当前登录用户HttpSession信息.

HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());

this.httpSession = httpSession;

System.out.println("当前登录用户 : " + httpSession.getAttribute("username") +", Endpoint : " +hashCode());

//3. 记录当前登录用户信息, 及对应的Endpoint实例

if (httpSession.getAttribute("username") != null){

onlineUsers.put(httpSession,this);

}

//4. 获取当前所有登录用户 --------> DZS168,dzs,TOM...

String names = getNames();

//5. 组装消息 ---> {"data":"dzs168,Deng,study","toName":"","fromName":"","type":"user"}

String message = MessageUtil.getContent(MessageUtil.TYPE_USER, "", "", names);

//6. 通过广播的形式发送消息

//session.getBasicRemote().sendText("");

broadcastAllUsers(message);

//7. 记录当前用户登录数 .

incrCount();

}

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}

@OnMessage

public void onMessage(String message, Session session) throws IOException {

System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );

//1. 获取客户端的信息内容, 并解析

Map<String,String> messageMap = JSON.parseObject(message, Map.class);

String fromName = messageMap.get("fromName");

String toName = messageMap.get("toName");

String content = messageMap.get("content");

//2. 判定是否有接收人

if(toName == null || toName.isEmpty()){

return;

}

//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息

String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);

System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);

if("all".equals(toName)){

//3.1 组装消息内容

broadcastAllUsers(messageContent);

}else{//4. 不是all , 则给指定的用户推送消息

singlePushMessage(messageContent, fromName,toName);

}

}

//给指定用户推送消息

private void singlePushMessage(String content, String fromName, String toName) throws IOException {

boolean isOnline = false;

//1. 判定当然接收人是否在线

for (HttpSession hsession : onlineUsers.keySet()) {

if(toName.equals(hsession.getAttribute("username"))){

isOnline = true;

}

}

//2. 如果存在, 发送消息

if(isOnline){

for (HttpSession hsession : onlineUsers.keySet()) {

if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){

onlineUsers.get(hsession).session.getBasicRemote().sendText(content);

}

}

}

}

// 发送广播消息

private void broadcastAllUsers(String message) {

for (HttpSession hsession : onlineUsers.keySet()) {

try {

onlineUsers.get(hsession).session.getBasicRemote().sendText(message);

} catch (Exception e) {

e.printStackTrace();

}

}

}

//获取所有的在线用户

private String getNames() {

String names = "";

if(onlineUsers.size()>0){

for (HttpSession hsession : onlineUsers.keySet()) {

String username = (String) hsession.getAttribute("username");

names += username+",";

}

}

return names.substring(0,names.length()-1);

}

public int getOnlineCount(){

return onlineCount;

}

public synchronized void incrCount(){

onlineCount ++;

}

public synchronized void decrCount(){

onlineCount --;

}

}

```

## 三、Tomcat专题 - WebSocket - 案例 - OnMessage功能测试

### 1、项目 dzs168_chat_room 中,前端源码 chat.jsp 页面。

<!-- project_tomcat\dzs168_chat_room\web\chat.jsp -->

```bash

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html lang="en">

<head>

<meta charset="utf-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="format-detection" content="telephone=no">

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">

<meta name="mobile-web-app-capable" content="yes">

<meta name="apple-mobile-web-app-capable" content="yes">

<meta content="yes" name="apple-mobile-web-app-capable">

<meta content="yes" name="apple-touch-fullscreen">

<meta name="full-screen" content="yes">

<meta content="default" name="apple-mobile-web-app-status-bar-style">

<meta name="screen-orientation" content="portrait">

<meta name="browsermode" content="application">

<meta name="msapplication-tap-highlight" content="no">

<meta name="x5-orientation" content="portrait">

<meta name="x5-fullscreen" content="true">

<meta name="x5-page-mode" content="app">

<base target="_blank">

<title>段子手168-聊天室</title>

<link href="css/bootstrap.min.css" rel="stylesheet" type="text/css"/>

<link rel="stylesheet" href="css/chat.css">

<script src="js/jquery-1.9.1.min.js"></script>

<script type="text/javascript">

<%

String name = session.getAttribute("username")+"";

%>

var self = "<%= name %>";

</script>

<script type="text/javascript" src="js/ws.js"></script>

</head>

<body onload="startWebSocket(self);">

<img style="width:100%;height:100%" src="img/chat_bg.jpg">

<div class="abs cover contaniner">

<div class="abs cover pnl">

<div class="top pnl-head" style="padding: 20px ; color: white;" id="userName"></div>

<div class="abs cover pnl-body" id="pnlBody">

<div class="abs cover pnl-left">

<div class="abs cover pnl-msgs scroll" id="show">

<div class="pnl-list" id="hists"><!-- 历史消息 --></div>

<div class="pnl-list" id="msgs">

<!-- 消息这展示区域 -->

</div>

</div>

<div class="abs bottom pnl-text">

<div class="abs cover pnl-input">

<textarea class="scroll" id="context_text" onkeydown="sendMessage(self)" wrap="hard" placeholder="在此输入文字信息..."></textarea>

<div class="abs atcom-pnl scroll hide" id="atcomPnl">

<ul class="atcom" id="atcom"></ul>

</div>

</div>

<div class="abs br pnl-btn" id="submit" style="background-color: rgb(32, 196, 202); color: rgb(255, 255, 255);" onclick="sendMsg(self)">

发送

</div>

<div class="pnl-support" id="copyright"><a href="http://www.itcast.cn">段子手168,版本所有</a></div>

</div>

</div>

<div class="abs right pnl-right">

<div class="slider-container hide"></div>

<div class="pnl-right-content">

<div class="pnl-tabs">

<div class="tab-btn active" id="hot-tab">好友列表</div>

</div>

<div class="pnl-hot">

<ul class="rel-list unselect" id="userlist">

</ul>

</div>

</div>

<div class="pnl-right-content">

<div class="pnl-tabs">

<div class="tab-btn active">系统广播</div>

</div>

<div class="pnl-hot">

<ul class="rel-list unselect" id="broadcastList">

</ul>

</div>

</div>

</div>

</div>

</div>

</div>

</body>

</html>

<!-- project_tomcat\dzs168_chat_room\web\chat.jsp -->

```

### 2、项目 dzs168_chat_room 中,前端源码 login.jsp 页面。

<!-- project_tomcat\dzs168_chat_room\web\login.jsp -->

```bash

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html lang="en">

<head>

<title>段子手聊天室——登录</title>

<meta name="viewport" content="width=device-width, initial-scale=1"/>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<meta name="keywords"

content="Transparent Sign In Form Responsive Widget,Login form widgets, Sign up Web forms , Login signup Responsive web form,Flat Pricing table,Flat Drop downs,Registration Forms,News letter Forms,Elements"/>

<script type="application/x-javascript">

addEventListener("load", function () {

setTimeout(hideURLbar, 0);

}, false);

function hideURLbar() {

window.scrollTo(0, 1);

}

</script>

<script src="js/jquery-1.9.1.min.js"></script>

<link rel="icon" href="img/chat.ico" type="image/x-icon"/>

<link rel="stylesheet" href="css/font-awesome.css"/> <!-- Font-Awesome-Icons-CSS -->

<link rel="stylesheet" href="css/login.css" type="text/css" media="all"/> <!-- Style-CSS -->

</head>

<body class="background">

<div class="header-w3l">

<h1>段子手168聊天室</h1>

</div>

<div class="main-content-agile">

<div class="sub-main-w3">

<h2>登录</h2>

<form>

<div class="icon1">

<input placeholder="用户名" id="username" type="text"/>

</div>

<div class="icon2">

<input placeholder="密码" id="password" type="password"/>

</div>

<div class="clear"></div>

<input type="button" value="登录" onclick="login()"/>

</form>

</div>

</div>

<div class="footer">

<p>段子手168 版权所有Copyright 2024-9-1 All Rights Reserved </p>

</div>

</body>

<script type="text/javascript">

function login() {

$.ajax({

type: 'POST',

url: '/login',

dataType: 'json',

data: {

username: $("#username").val(),

password: $("#password").val()

},

success: function (data) {

if (data.success) {

window.location.href = "chat.jsp";

} else {

alert(data.message);

}

}

});

}

</script>

</html>

<!-- project_tomcat\dzs168_chat_room\web\login.jsp -->

```

### 3、项目 dzs168_chat_room 中,//定义全局的webSocket对象 ws.js 源码。

...\project_tomcat\dzs168_chat_room\web\js\ws.js

```bash

//定义全局的webSocket对象

var ws = null;

function startWebSocket(self) {

//构建WebSocket对象

if ('WebSocket' in window) {

ws = new WebSocket("ws://localhost:8080/websocket");

} else if ('MozWebSocket' in window) {

ws = new MozWebSocket("ws://localhost:8080/websocket");

} else {

alert("not support");

}

//监听消息, 有消息传递, 会触发此方法

ws.onmessage = function (evt) {

var _data = evt.data;

console.log(">> : " + _data);

var o = JSON.parse(_data);

if (o.type == 'message') { //如果后端, 响应的是消息, 在页面展示

setMessageInnerHTML(o, self);

} else if (o.type == 'user') { // 如果服务端响应的是用户列表, 在界面展示用户列表

var userArry = o.data.split(',');

$("#userlist").empty();

$("#userlist").append('<li class="rel-item"><input type="radio" name="toUser" value="all">广播</input></li>');

$.each(userArry, function (n, value) {

if (value != self && value != 'admin') {

$("#userlist").append('<li class="rel-item"><input type="radio" name="toUser" value="'+value+'">'+value+'</input></li>');

$("#broadcastList").append('<li class="rel-item">您的好友 '+value+' 已上线</li>');

}

});

}

};

//关闭链接时触发

ws.onclose = function (evt) {

$('#userName').html("用户: "+ self +"<span style='float: right;color: red'>离线</span>");

};

//打开时触发

ws.onopen = function (evt) {

$('#userName').html("用户: "+ self +"<span style='float: right;color: green'>在线</span>");

};

}

function setMessageInnerHTML(msg, self) {

//根据后台响应的数据, 判定是展示在左侧还是右侧.

var str = "";

if(msg.toName == 'all'){

$("#broadcastList").append('<li class="rel-item"> 系统广播消息: '+msg.data+' </li>');

}else if (msg.fromName == self) {

str = "<div class=\"msg guest\"><div class=\"msg-right\"><div class=\"msg-host headDefault\"></div><div class=\"msg-ball\" title=\"今天 17:52:06\">" + msg.data + "</div></div></div>"

} else if(msg.toName == self){

str = "<div class=\"msg robot\"><div class=\"msg-left\" worker=\"" + msg.fromName + "\"><div class=\"msg-host photo\" style=\"background-image: url(../img/avatar/Member002.jpg)\"></div><div class=\"msg-ball\" title=\"今天 17:52:06\">" + msg.data + "</div></div></div>";

}

//获取到现有的内容, 追加新的消息内容

var msgs = document.getElementById("msgs");

msgs.innerHTML = msgs.innerHTML + str;

//判定消息来源的用户 , 勾选对应的好友信息

var a = $('input[name="toUser"]');

for(var i=0 ; i < a.length ; i++){

if(a[i].value == msg.fromName){

console.log(a[i]);

a[i].checked='checked';

}

}

}

// 组装消息, 发送消息

function sendMsg(self) {

var content = $("#context_text").val();

if(!content){

alert('请输入消息内容');

return ;

}

var message = {};

message.fromName = self;

message.toName = $('input:radio:checked').val(); //根据界面勾选的用户, 来决定消息发送给谁

message.content = content; //获取输入文本框中输入的内容

var msg = JSON.stringify(message);

console.log(" msg: "+msg);

ws.send(msg);//发送消息

$("#context_text").val(''); //将输入框内容置为空

}

function sendMessage(self){

if(event.keyCode == 13){

sendMsg(self);

}

}

```

### 4、运行 tomcat 服务,进行测试。

### 5、多个 浏览器地址栏输入:localhost:8080/ 登录几个不同用户,进行测试。

## 四、Tomcat专题 - WebSocket - 案例 - OnClose及OnError介绍

### 1、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onClose(Session session, CloseReason closeReason){...} 方法。

```bash

@OnClose

public void onClose(Session session, CloseReason closeReason){

decrCount();

System.out.println("客户端关闭了一个连接 , 当前在线人数 : " + getOnlineCount());

}

```

### 2、在项目 dzs168_chat_room 中,在 websocket 类 ChatSocket.java 中,

创建 public void onError(Session session, Throwable throwable){...} 方法。

```bash

@OnError

public void onError(Session session, Throwable throwable){

throwable.printStackTrace();

System.out.println("服务异常");

}

```

### 3、项目 dzs168_chat_room 中,websocket 类 ChatSocket.java 代码。

```bash

/**

* project_tomcat\dzs168_chat_room\src\djh\it\websocket\ChatSocket.java

*

* 2024-9-2 创建 websocket 类 ChatSocket.java

*/

package djh.it.websocket;

import djh.it.utils.MessageUtil;

import com.alibaba.fastjson.JSON;

import javax.servlet.http.HttpSession;

import javax.websocket.*;

import javax.websocket.server.ServerEndpoint;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

@ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class )

public class ChatSocket {

private Session session;

private HttpSession httpSession;

//保存当前系统中登录的用户的HttpSession信息, 及对应的Endpoint实例信息

private static Map<HttpSession , ChatSocket> onlineUsers = new HashMap<HttpSession, ChatSocket>();

private static int onlineCount = 0;

@OnOpen

public void onOpen(Session session, EndpointConfig config){

//1. 记录webSocket的会话信息对象Session

this.session = session;

//2. 获取当前登录用户HttpSession信息.

HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());

this.httpSession = httpSession;

System.out.println("当前登录用户 : " + httpSession.getAttribute("username") +", Endpoint : " +hashCode());

//3. 记录当前登录用户信息, 及对应的Endpoint实例

if (httpSession.getAttribute("username") != null){

onlineUsers.put(httpSession,this);

}

//4. 获取当前所有登录用户 --------> DZS168,dzs,TOM...

String names = getNames();

//5. 组装消息 ---> {"data":"dzs168,Deng,study","toName":"","fromName":"","type":"user"}

String message = MessageUtil.getContent(MessageUtil.TYPE_USER, "", "", names);

//6. 通过广播的形式发送消息

//session.getBasicRemote().sendText("");

broadcastAllUsers(message);

//7. 记录当前用户登录数 .

incrCount();

}

//{"fromName":"Deng","toName":"HEIMA","content":"约会呀"}

@OnMessage

public void onMessage(String message, Session session) throws IOException {

System.out.println("onMessage : name = " + httpSession.getAttribute("username")+ ", message=" + message );

//1. 获取客户端的信息内容, 并解析

Map<String,String> messageMap = JSON.parseObject(message, Map.class);

String fromName = messageMap.get("fromName");

String toName = messageMap.get("toName");

String content = messageMap.get("content");

//2. 判定是否有接收人

if(toName == null || toName.isEmpty()){

return;

}

//3. 如果接收人是否是广播(all), 如果是, 则说明发送广播消息

String messageContent = MessageUtil.getContent(MessageUtil.TYPE_MESSAGE, fromName, toName, content);

System.out.println("服务端给客户端发送消息, 消息内容: " + messageContent);

if("all".equals(toName)){

//3.1 组装消息内容

broadcastAllUsers(messageContent);

}else{//4. 不是all , 则给指定的用户推送消息

singlePushMessage(messageContent, fromName,toName);

}

}

//给指定用户推送消息

private void singlePushMessage(String content, String fromName, String toName) throws IOException {

boolean isOnline = false;

//1. 判定当然接收人是否在线

for (HttpSession hsession : onlineUsers.keySet()) {

if(toName.equals(hsession.getAttribute("username"))){

isOnline = true;

}

}

//2. 如果存在, 发送消息

if(isOnline){

for (HttpSession hsession : onlineUsers.keySet()) {

if (hsession.getAttribute("username").equals(fromName) || hsession.getAttribute("username").equals(toName)){

onlineUsers.get(hsession).session.getBasicRemote().sendText(content);

}

}

}

}

// 发送广播消息

private void broadcastAllUsers(String message) {

for (HttpSession hsession : onlineUsers.keySet()) {

try {

onlineUsers.get(hsession).session.getBasicRemote().sendText(message);

} catch (Exception e) {

e.printStackTrace();

}

}

}

//获取所有的在线用户

private String getNames() {

String names = "";

if(onlineUsers.size()>0){

for (HttpSession hsession : onlineUsers.keySet()) {

String username = (String) hsession.getAttribute("username");

names += username+",";

}

}

return names.substring(0,names.length()-1);

}

@OnClose

public void onClose(Session session, CloseReason closeReason){

decrCount();

System.out.println("客户端关闭了一个连接 , 当前在线人数 : " + getOnlineCount());

}

@OnError

public void onError(Session session, Throwable throwable){

throwable.printStackTrace();

System.out.println("服务异常");

}

public int getOnlineCount(){

return onlineCount;

}

public synchronized void incrCount(){

onlineCount ++;

}

public synchronized void decrCount(){

onlineCount --;

}

}

```

### 4、重新运行 tomcat 服务,多个 浏览器地址栏输入:localhost:8080/ 登录几个不同用户,再退出登录,进行测试。



上一节关联链接请点击:

02_tomcat 通过 websocket 实现一个简易聊天室功能-项目-教程(二)

相关推荐

5款Syslog集中系统日志常用工具对比推荐

一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...

跨平台、多数据库支持的开源数据库管理工具——DBeaver

简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...

强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)

NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...

3 年 Java 程序员还玩不转 MongoDB,网友:失望

一、什么场景使用MongoDB?...

拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南

作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...

mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?

前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...

solidworks使用心得,纯干货!建议大家收藏

SolidWorks常见问题...

统一规约-关乎数字化的真正实现(规范统一性)

尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...

Elasticsearch节点角色配置详解(Node)

本篇文章将介绍如下内容:节点角色简介...

产前母婴用品分享 篇一:我的母婴购物清单及单品推荐

作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...

比任何人都光彩照人的假期!水润、紧致的肌肤护理程序

图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...

Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型

中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...

柔性——面向大规模定制生产的数字化实现的基本特征

大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...

创建PLC内部标准——企业前进的道路

作者:FrankBurger...

标准化编程之 ----------- 西门子LPMLV30测试总结

PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...

取消回复欢迎 发表评论: