From 75092d1748587ecff8c7d0c5de6696b3a96c62a1 Mon Sep 17 00:00:00 2001 From: linbenlei <572833793@qq.com> Date: Fri, 5 Mar 2021 10:49:51 +0800 Subject: [PATCH] fix: 初次提交 --- .gitignore | 33 +++++++++++++++++++++++++++++++++ mvnw | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mvnw.cmd | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pom.xml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/Application.java | 13 +++++++++++++ src/main/java/com/example/mina/config/ConfigMina.java | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/config/SecurityConfig.java | 27 +++++++++++++++++++++++++++ src/main/java/com/example/mina/controller/RouterController.java | 41 +++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/http/HttpSimulator.java | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/client/MinaClient.java | 40 ++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/client/MinaClientHandler.java | 39 +++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/code/ByteDecoder.java | 29 +++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/code/ByteEnCoder.java | 37 +++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/code/ByteFactory.java | 34 ++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/server/MinaServer.java | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/mina/server/MinaServerHandler.java | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/resources/application.properties | 1 + src/main/resources/application.yml | 13 +++++++++++++ src/main/resources/templates/index.html | 10 ++++++++++ src/main/resources/templates/views/level1/1.html | 10 ++++++++++ src/main/resources/templates/views/level1/2.html | 10 ++++++++++ src/main/resources/templates/views/level1/3.html | 10 ++++++++++ src/main/resources/templates/views/level2/1.html | 10 ++++++++++ src/main/resources/templates/views/level2/2.html | 10 ++++++++++ src/main/resources/templates/views/level2/3.html | 10 ++++++++++ src/main/resources/templates/views/level3/1.html | 10 ++++++++++ src/main/resources/templates/views/level3/2.html | 10 ++++++++++ src/main/resources/templates/views/level3/3.html | 10 ++++++++++ src/main/resources/templates/views/login.html | 10 ++++++++++ 29 files changed, 1490 insertions(+), 0 deletions(-) create mode 100644 .gitignore create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/example/mina/Application.java create mode 100644 src/main/java/com/example/mina/config/ConfigMina.java create mode 100644 src/main/java/com/example/mina/config/SecurityConfig.java create mode 100644 src/main/java/com/example/mina/controller/RouterController.java create mode 100644 src/main/java/com/example/mina/http/HttpSimulator.java create mode 100644 src/main/java/com/example/mina/mina/client/MinaClient.java create mode 100644 src/main/java/com/example/mina/mina/client/MinaClientHandler.java create mode 100644 src/main/java/com/example/mina/mina/code/ByteDecoder.java create mode 100644 src/main/java/com/example/mina/mina/code/ByteEnCoder.java create mode 100644 src/main/java/com/example/mina/mina/code/ByteFactory.java create mode 100644 src/main/java/com/example/mina/mina/server/MinaServer.java create mode 100644 src/main/java/com/example/mina/mina/server/MinaServerHandler.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/templates/index.html create mode 100644 src/main/resources/templates/views/level1/1.html create mode 100644 src/main/resources/templates/views/level1/2.html create mode 100644 src/main/resources/templates/views/level1/3.html create mode 100644 src/main/resources/templates/views/level2/1.html create mode 100644 src/main/resources/templates/views/level2/2.html create mode 100644 src/main/resources/templates/views/level2/3.html create mode 100644 src/main/resources/templates/views/level3/1.html create mode 100644 src/main/resources/templates/views/level3/2.html create mode 100644 src/main/resources/templates/views/level3/3.html create mode 100644 src/main/resources/templates/views/login.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..3c8a553 --- /dev/null +++ b/mvnw @@ -0,0 +1,322 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ]; then + + if [ -f /etc/mavenrc ]; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ]; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +darwin=false +mingw=false +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="$(/usr/libexec/java_home)" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) + fi +fi + +if [ -z "$M2_HOME" ]; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then + PRG="$link" + else + PRG="$(dirname "$PRG")/$link" + fi + done + + saveddir=$(pwd) + + M2_HOME=$(dirname "$PRG")/.. + + # make it fully qualified + M2_HOME=$(cd "$M2_HOME" && pwd) + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=$(cygpath --unix "$M2_HOME") + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw; then + [ -n "$M2_HOME" ] && + M2_HOME="$( ( + cd "$M2_HOME" + pwd + ))" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="$( ( + cd "$JAVA_HOME" + pwd + ))" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=$(which readlink) + if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then + if $darwin; then + javaHome="$(dirname \"$javaExecutable\")" + javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" + else + javaExecutable="$(readlink -f \"$javaExecutable\")" + fi + javaHome="$(dirname \"$javaExecutable\")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="$(which java)" + fi +fi + +if [ ! -x "$JAVACMD" ]; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=$( + cd "$wdir/.." + pwd + ) + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' <"$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(pwd)") +if [ -z "$BASE_DIR" ]; then + exit 1 +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in wrapperUrl) + jarUrl="$value" + break + ;; + esac + done <"$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget >/dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl >/dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=$(cygpath --path --windows "$javaClass") + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=$(cygpath --path --windows "$M2_HOME") + [ -n "$JAVA_HOME" ] && + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] && + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8b25934 --- /dev/null +++ b/pom.xml @@ -0,0 +1,103 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.11.RELEASE + + + com.example + demo + 0.0.1-SNAPSHOT + mina + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + org.springframework.statemachine + spring-statemachine-core + 1.2.0.RELEASE + + + + + org.apache.mina + mina-core + 2.1.3 + + + org.apache.mina + mina-integration-spring + 1.1.7 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/example/mina/Application.java b/src/main/java/com/example/mina/Application.java new file mode 100644 index 0000000..4208ee5 --- /dev/null +++ b/src/main/java/com/example/mina/Application.java @@ -0,0 +1,13 @@ +package com.example.mina; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/src/main/java/com/example/mina/config/ConfigMina.java b/src/main/java/com/example/mina/config/ConfigMina.java new file mode 100644 index 0000000..88248a5 --- /dev/null +++ b/src/main/java/com/example/mina/config/ConfigMina.java @@ -0,0 +1,97 @@ +package com.example.mina.config; + +import com.example.mina.mina.code.ByteFactory; +import com.example.mina.mina.server.MinaServerHandler; +import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; +import org.apache.mina.core.service.IoAcceptor; +import org.apache.mina.core.session.IdleStatus; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.filter.executor.ExecutorFilter; +import org.apache.mina.filter.logging.LoggingFilter; +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; +import java.net.InetSocketAddress; + +/** + * @author dy + * @date 2021/3/3 + */ +@Configuration +public class ConfigMina { + + /** + * 配置mina的多线程过滤器 + * + * @return + */ + @Bean + public ExecutorFilter executorFilter() { + //设置初始化线程数,最大线程数 + ExecutorFilter executorFilter = new ExecutorFilter(10, 20); + return executorFilter; + } + + /** + * 配置mina的转码过滤器 + * + * @return + */ + @Bean + public ProtocolCodecFilter protocolCodecFilter() { +// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), +// LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); + + + //TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); + ProtocolCodecFilter pcf = new ProtocolCodecFilter(new ByteFactory()); + //ProtocolCodecFilter pcf = new ProtocolCodecFilter(factory); + return pcf; + } + + /** + * 配置mina的日志过滤器 + * + * @return + */ + @Bean + public LoggingFilter loggingFilter() { + return new LoggingFilter(); + } + + /** + * 将过滤器注入到mina的链式管理器中 + * + * @return + */ + @Bean + public DefaultIoFilterChainBuilder defaultIoFilterChainBuilder() { + DefaultIoFilterChainBuilder def = new DefaultIoFilterChainBuilder(); + def.addLast("executor", executorFilter()); + def.addLast("logger", loggingFilter()); + def.addLast("protocol", protocolCodecFilter()); + return def; + } + + /** + * 开启mina的server服务,并设置对应的参数 + * + * @return + * @throws IOException + */ + @Bean + public IoAcceptor ioAcceptor() throws IOException { + IoAcceptor nio = new NioSocketAcceptor(); + //设置缓冲区大小 + nio.getSessionConfig().setReadBufferSize(2048); + //设置空闲状态时间,10秒没操作就进入空闲状态 + nio.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); + nio.setFilterChainBuilder(defaultIoFilterChainBuilder()); + nio.setHandler(new MinaServerHandler()); + nio.bind(new InetSocketAddress(9098)); + return nio; + } + +} diff --git a/src/main/java/com/example/mina/config/SecurityConfig.java b/src/main/java/com/example/mina/config/SecurityConfig.java new file mode 100644 index 0000000..e78b952 --- /dev/null +++ b/src/main/java/com/example/mina/config/SecurityConfig.java @@ -0,0 +1,27 @@ +package com.example.mina.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +/** + * @author dy + * @date 2021/2/25 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + // 首页所有人都可以访问,功能也只有对应有权限的人才能访问到 + // 请求授权的规则 + +// http.authorizeRequests() +// .antMatchers("/").permitAll() +// .antMatchers("/level1/**").hasRole("vip1") +// .antMatchers("/level2/**").hasRole("vip2") +// .antMatchers("/level3/**").hasRole("vip3"); + // 开启自动配置的登录功能 + http.formLogin(); + } +} diff --git a/src/main/java/com/example/mina/controller/RouterController.java b/src/main/java/com/example/mina/controller/RouterController.java new file mode 100644 index 0000000..45f9a82 --- /dev/null +++ b/src/main/java/com/example/mina/controller/RouterController.java @@ -0,0 +1,41 @@ +package com.example.mina.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * @author dy + * @date 2021/2/22 + */ +@Controller +@Slf4j +public class RouterController { + + @GetMapping({"/", "/index"}) + public String index() { + log.info("是否进入程序"); + return "/index"; + } + + @GetMapping("/toLogin") + public String toLogin() { + return "views/login"; + } + + @GetMapping("/level1/{id}") + public String level1(@PathVariable("id") int id) { + return "views/level1/" + id; + } + + @GetMapping("/level2/{id}") + public String level2(@PathVariable("id") int id) { + return "views/level2/" + id; + } + + @GetMapping("/level3/{id}") + public String level3(@PathVariable("id") int id) { + return "views/level3/" + id; + } +} diff --git a/src/main/java/com/example/mina/http/HttpSimulator.java b/src/main/java/com/example/mina/http/HttpSimulator.java new file mode 100644 index 0000000..5c9951f --- /dev/null +++ b/src/main/java/com/example/mina/http/HttpSimulator.java @@ -0,0 +1,136 @@ +package com.example.mina.http; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; + +/** + * @author dy + * @date 2021/3/4 + */ +public class HttpSimulator { + + private Socket socket; + + private int port = 80; + + private String host = "localhost"; + + private String request = ""; // HTTP请求消息 + + private boolean isPost, isHead; + + + public void run() throws Exception { + BufferedReader reader = new BufferedReader(new InputStreamReader( + System.in)); + while (true) // 开始大循环 + { + try { + if (!readHostAndPort(reader)) { + break; + } + readHttpRequest(reader); + sendHttpRequest(); + readHttpResponse(reader); + + } catch (Exception e) { + System.out.println("err:" + e.getMessage()); + + } + + } + + } + + + public static void main(String[] args) throws Exception { + new HttpSimulator().run(); + + } + + private boolean readHostAndPort(BufferedReader consoleReader) + throws Exception { + System.out.print("host:port>"); + String[] ss = null; + String s = consoleReader.readLine(); + if (s.equals("q")) { + return false; + } else { + ss = s.split("[:]"); + if (!ss[0].equals("")) { + host = ss[0]; + } + if (ss.length > 1) { + port = Integer.parseInt(ss[1]); + } + System.out.println(host + ":" + String.valueOf(port)); + return true; + } + } + + private void readHttpRequest(BufferedReader consoleReader) + throws Exception { + System.out.println("请输入HTTP请求:"); + String s = consoleReader.readLine(); + request = s + "\r\n"; + boolean isPost = s.substring(0, 4).equals("POST"); + boolean isHead = s.substring(0, 4).equals("HEAD"); + while (!(s = consoleReader.readLine()).equals("")) { + request = request + s + "\r\n"; + } + request = request + "\r\n"; + if (isPost) { + System.out.println("请输入POST方法的内容:"); + s = consoleReader.readLine(); + request = request + s; + } + } + + private void sendHttpRequest() throws Exception { + socket = new Socket(); + socket.setSoTimeout(10 * 1000); + System.out.println("正在连接服务器"); + socket.connect(new InetSocketAddress(host, port), 10 * 1000); + System.out.println("服务器连接成功!"); + OutputStream out = socket.getOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(out); + writer.write(request); + writer.flush(); + } + + private void readHttpResponse(BufferedReader consoleReader) { + String s = ""; + try { + InputStream in = socket.getInputStream(); + InputStreamReader inReader = new InputStreamReader(in); + BufferedReader socketReader = new BufferedReader(inReader); + System.out.println("---------HTTP头---------"); + boolean b = true; // true: 未读取消息头 false: 已经读取消息头 + while ((s = socketReader.readLine()) != null) { + if (s.equals("") && b == true && !isHead) { + System.out.println("------------------------"); + b = false; + System.out.print("是否显示HTTP的内容(Y/N):"); + String choice = consoleReader.readLine(); + if (choice.equals("Y") || choice.equals("y")) { + System.out.println("---------HTTP内容---------"); + continue; + } else { + break; + } + } else { + System.out.println(s); + } + } + } catch (Exception e) { + System.out.println("err:" + e.getMessage()); + } finally { + try { + socket.close(); + } catch (Exception e) { + } + } + System.out.println("------------------------"); + } +} diff --git a/src/main/java/com/example/mina/mina/client/MinaClient.java b/src/main/java/com/example/mina/mina/client/MinaClient.java new file mode 100644 index 0000000..5fc8f64 --- /dev/null +++ b/src/main/java/com/example/mina/mina/client/MinaClient.java @@ -0,0 +1,40 @@ +package com.example.mina.mina.client; + +import org.apache.mina.core.service.IoConnector; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.filter.codec.textline.LineDelimiter; +import org.apache.mina.filter.codec.textline.TextLineCodecFactory; +import org.apache.mina.transport.socket.nio.NioSocketConnector; + +import java.net.InetSocketAddress; +import java.nio.charset.Charset; + +/** + * @author dy + * @date 2021/3/3 + */ +public class MinaClient { + + public static void main(String[] args) { + //1、创建客户端IoService + IoConnector connector = new NioSocketConnector(); + //客户端链接超时时间 + connector.setConnectTimeoutMillis(30000); + //2、客户端过滤器 + connector.getFilterChain().addLast("test", + new ProtocolCodecFilter( + new TextLineCodecFactory( + Charset.forName("UTF-8"), + LineDelimiter.WINDOWS.getValue(), + LineDelimiter.WINDOWS.getValue() + ) + ) + ); + //3、客户端IoHandler,发生消息 + connector.setHandler(new MinaClientHandler("2")); + //连接服务端 + connector.connect(new InetSocketAddress("localhost", 9098)); + + } + +} diff --git a/src/main/java/com/example/mina/mina/client/MinaClientHandler.java b/src/main/java/com/example/mina/mina/client/MinaClientHandler.java new file mode 100644 index 0000000..b4f9f05 --- /dev/null +++ b/src/main/java/com/example/mina/mina/client/MinaClientHandler.java @@ -0,0 +1,39 @@ +package com.example.mina.mina.client; + +import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IoSession; + +/** + * @author dy + * @date 2021/3/3 + */ +public class MinaClientHandler extends IoHandlerAdapter { + + private final String values; + + public MinaClientHandler(String values) { + this.values = values; + } + + @Override + public void sessionOpened(IoSession session) { + session.write(values); +// //调用IoService的dispose方法关闭线程,这样每次调用client方法发送数据之后就会关闭client +// IoService service = session.getService(); +// service.dispose(); + + } + + /** + * 接收服务器端反馈消息 + * + * @param session + * @param message + * @throws Exception + */ + @Override + public void messageReceived(IoSession session, Object message) throws Exception { + System.out.println("收到服务器响应消息:" + message); + } + +} diff --git a/src/main/java/com/example/mina/mina/code/ByteDecoder.java b/src/main/java/com/example/mina/mina/code/ByteDecoder.java new file mode 100644 index 0000000..a373b5d --- /dev/null +++ b/src/main/java/com/example/mina/mina/code/ByteDecoder.java @@ -0,0 +1,29 @@ +package com.example.mina.mina.code; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderAdapter; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author dy + * @date 2021/3/3 + */ +public class ByteDecoder extends ProtocolDecoderAdapter { + //打印日志信息 + private final static Logger log = LoggerFactory + .getLogger(ProtocolDecoder.class); + + @Override + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { + int limit = in.limit(); + byte[] bytes = new byte[limit]; + + in.get(bytes); + + out.write(bytes); + } +} diff --git a/src/main/java/com/example/mina/mina/code/ByteEnCoder.java b/src/main/java/com/example/mina/mina/code/ByteEnCoder.java new file mode 100644 index 0000000..05d8aad --- /dev/null +++ b/src/main/java/com/example/mina/mina/code/ByteEnCoder.java @@ -0,0 +1,37 @@ +package com.example.mina.mina.code; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderAdapter; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author dy + * @date 2021/3/3 + */ +public class ByteEnCoder extends ProtocolEncoderAdapter { + //用于打印日志信息 + private final static Logger log = LoggerFactory + .getLogger(ProtocolEncoder.class); + + //编码 将数据包转成字节数组 + @Override + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { + byte[] bytes = (byte[]) message; + + IoBuffer buffer = IoBuffer.allocate(256); + buffer.setAutoExpand(true); + + buffer.put(bytes); + buffer.flip(); + + out.write(buffer); + out.flush(); + + buffer.free(); + } + +} diff --git a/src/main/java/com/example/mina/mina/code/ByteFactory.java b/src/main/java/com/example/mina/mina/code/ByteFactory.java new file mode 100644 index 0000000..926ceb7 --- /dev/null +++ b/src/main/java/com/example/mina/mina/code/ByteFactory.java @@ -0,0 +1,34 @@ +package com.example.mina.mina.code; + +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * @author dy + * @date 2021/3/3 + */ +public class ByteFactory implements ProtocolCodecFactory { + private final ByteDecoder decoder; + private final ByteEnCoder encoder; + + //构造 + public ByteFactory() { + encoder = new ByteEnCoder(); + decoder = new ByteDecoder(); + } + + @Override + public ProtocolDecoder getDecoder(IoSession arg0) throws Exception { + // TODO Auto-generated method stub + return decoder; + } + + @Override + public ProtocolEncoder getEncoder(IoSession arg0) throws Exception { + // TODO Auto-generated method stub + return encoder; + } + +} diff --git a/src/main/java/com/example/mina/mina/server/MinaServer.java b/src/main/java/com/example/mina/mina/server/MinaServer.java new file mode 100644 index 0000000..132c063 --- /dev/null +++ b/src/main/java/com/example/mina/mina/server/MinaServer.java @@ -0,0 +1,92 @@ +package com.example.mina.mina.server; + +import com.example.mina.mina.code.ByteFactory; +import org.apache.mina.core.service.IoAcceptor; +import org.apache.mina.core.session.IdleStatus; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.filter.codec.textline.LineDelimiter; +import org.apache.mina.filter.codec.textline.TextLineCodecFactory; +import org.apache.mina.filter.executor.ExecutorFilter; +import org.apache.mina.filter.logging.LogLevel; +import org.apache.mina.filter.logging.LoggingFilter; +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.charset.Charset; + +/** + * @author dy + * @date 2021/3/3 + */ +public class MinaServer { + + public static ExecutorFilter executorFilter() { + //设置初始化线程数,最大线程数 + ExecutorFilter executorFilter = new ExecutorFilter(10, 20); + return executorFilter; + } + + public static LoggingFilter loggingFilter() { + return new LoggingFilter(); + } + + public static ProtocolCodecFilter protocolCodecFilter() { +// TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), +// LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); + + + //TextLineCodecFactory factory = new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()); + ProtocolCodecFilter pcf = new ProtocolCodecFilter(new ByteFactory()); + //ProtocolCodecFilter pcf = new ProtocolCodecFilter(factory); + return pcf; + } + + public static void main(String[] args) throws IOException { + /*IoAcceptor nio = new NioSocketAcceptor(); + //设置缓冲区大小 + nio.getSessionConfig().setReadBufferSize(2048); + //设置空闲状态时间,10秒没操作就进入空闲状态 + nio.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); + + DefaultIoFilterChainBuilder def = new DefaultIoFilterChainBuilder(); + def.addLast("executor", executorFilter()); + def.addLast("logger", loggingFilter()); + def.addLast("protocol", protocolCodecFilter()); + + nio.setFilterChainBuilder(def); + nio.setHandler(new MinaServerHandler()); + nio.bind(new InetSocketAddress(9098));*/ + + + + + + //1、创建IoService,拥有监听是否有客户端链接 + IoAcceptor acceptor = new NioSocketAcceptor(); + //设置缓冲区大小 + acceptor.getSessionConfig().setReadBufferSize(2048); + //设置空闲状态时间,10秒没操作就进入空闲状态 + acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); + + //创建日志过滤器,mina内部使用的是slf4j日志,加入日志之后可以查看mina的运行细节信息 + LoggingFilter log = new LoggingFilter(); + log.setSessionOpenedLogLevel(LogLevel.INFO); + acceptor.getFilterChain().addLast("logger", log); + + //2、实现过滤器 + //acceptor.getFilterChain().addLast("protocol", protocolCodecFilter()); + acceptor.getFilterChain().addLast("protocol", + new ProtocolCodecFilter( + new TextLineCodecFactory(Charset.forName("UTF-8"), LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue()) + ) + ); + //3、实现IoHandler,并注册到IoService + acceptor.setHandler(new MinaServerHandler()); + //绑定端口,绑定之前必须设置handler实现类 + acceptor.bind(new InetSocketAddress(9098)); + + + } + +} diff --git a/src/main/java/com/example/mina/mina/server/MinaServerHandler.java b/src/main/java/com/example/mina/mina/server/MinaServerHandler.java new file mode 100644 index 0000000..fc0be42 --- /dev/null +++ b/src/main/java/com/example/mina/mina/server/MinaServerHandler.java @@ -0,0 +1,141 @@ +package com.example.mina.mina.server; + +import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IoSession; + +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.net.SocketAddress; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * @author dy + * @date 2021/3/3 + */ +public class MinaServerHandler extends IoHandlerAdapter { + + @Override + public void messageReceived(IoSession session, Object message) throws Exception { +// String command = new String(ObjectToByte(message)).trim(); +// +// if (command.startsWith("ATTN ALL MAX")) {//set all to max +// for (int i = 1; i < dataBuffer.getMaxRow(); i++) { +// dataBuffer.setOffset(i, dataBuffer.getMaxAtten()); +// } +// +// return NONE; +// } else if (command.startsWith("ATTN?")) {//get +// String[] sss = command.split(" "); +// if (sss.length >= 2) { +// LogUtils.println(sss[0], sss[1]); +// +// int row = StrUtil.toInt(sss[1]); +// if (row >= 0 && row <= dataBuffer.getMaxRow()) { +// String str = String.valueOf(dataBuffer.getOffset(row)); +// LogUtils.println("AeroflexVirtualBoxService::handleCommand return : ", str); +// return str.getBytes(); +// } +// } +// +// return ERROR; +// } else if (command.startsWith("ATTN")) {//Set, Follow by ATTN? +// LogUtils.println("command.startsWith(\"ATTN\")"); +// String[] aa = command.split(";"); +// +// LogUtils.println(aa[0], aa[1]); +// +// String[] sss = aa[0].split(" "); +// StrUtil.printArray(sss); +// +// if (sss.length >= 3) { +// int row = StrUtil.toInt(sss[1]); +// int val = StrUtil.toInt(sss[2]); +// +// System.out.println(row + "/" + val); +// +// +// if (row >= 0 && row <= dataBuffer.getMaxRow()) { +// if (val >= 0 && val <= dataBuffer.getMaxAtten()) { +// dataBuffer.setOffset(row, val); +// +// String str = String.valueOf(dataBuffer.getOffset(row)); +// LogUtils.println("handleCommand return =====> ", str); +// return str.getBytes(); +// } +// } +// } + + //业务代码在这里编写处理 + String str = new String((byte[])message); + System.out.println("The message received is [" + str + "]"); + //获取客户端的连接地址 + SocketAddress socketAddress = session.getRemoteAddress(); + System.out.println(socketAddress); + String send = "消息已处理,你可以去玩了。。。"; + //响应给对应客户端信息 + session.write(send.getBytes()); + session.closeNow(); +// // 此处关闭session后客户端无法接收到服务器反馈的消息 +// if (str.endsWith("quit")) { +// //注意:在这里调用close方法之后,只是关闭当前的tcp连接,server端还正常运行, +// //需要调用IoService的dispose方法才能关闭server端,client端同理 +// +// return; +// } + } + + @Override + public void sessionCreated(IoSession session) throws Exception { + System.out.println("server session created"); + super.sessionCreated(session); + } + + @Override + public void sessionOpened(IoSession session) throws Exception { + System.out.println("server session Opened"); + super.sessionOpened(session); + } + + @Override + public void sessionClosed(IoSession session) throws Exception { + System.out.println("server session Closed"); + super.sessionClosed(session); + } + + /** + * 在IoHandlerAdapter中有一个messageSent的方法,但是重写这个方法之后,不会发送数据,该方法只有数据发送成功之后才会调用, + * 所以在 messageReceived 方法中使用 session.write("消息已处理,你可以去玩了。。。"); 给客户端响应数据 + * + * @param session + * @param message + * @throws Exception + */ + @Override + public void messageSent(IoSession session, Object message) throws Exception { + // TODO Auto-generated method stub + System.out.println("发送数据成功了。。。" + message); + // session.write("testSent"); + super.messageSent(session, message); + } + + private byte[] ObjectToByte(Object obj) { + byte[] bytes = null; + try { + // object to bytearray + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + ObjectOutputStream oo = new ObjectOutputStream(bo); + oo.writeObject(obj); + + bytes = bo.toByteArray(); + + bo.close(); + oo.close(); + } catch (Exception e) { + System.out.println("translation" + e.getMessage()); + e.printStackTrace(); + } + return bytes; + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..e26c199 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,13 @@ +server: + port: 8080 + servlet: + context-path: /test + +# rabbitmq配置 + #spring: + # rabbitmq: + # host: localhost + # port: 5672 + # username: guest + # password: guest + # virtual-host: / \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..ea8c29e --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是首页
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level1/1.html b/src/main/resources/templates/views/level1/1.html new file mode 100644 index 0000000..eeceebe --- /dev/null +++ b/src/main/resources/templates/views/level1/1.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level1-1
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level1/2.html b/src/main/resources/templates/views/level1/2.html new file mode 100644 index 0000000..7960ba5 --- /dev/null +++ b/src/main/resources/templates/views/level1/2.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level1-2
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level1/3.html b/src/main/resources/templates/views/level1/3.html new file mode 100644 index 0000000..16440b0 --- /dev/null +++ b/src/main/resources/templates/views/level1/3.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level1-3
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level2/1.html b/src/main/resources/templates/views/level2/1.html new file mode 100644 index 0000000..61ec2dc --- /dev/null +++ b/src/main/resources/templates/views/level2/1.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level2-1
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level2/2.html b/src/main/resources/templates/views/level2/2.html new file mode 100644 index 0000000..f7ad359 --- /dev/null +++ b/src/main/resources/templates/views/level2/2.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level2-2
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level2/3.html b/src/main/resources/templates/views/level2/3.html new file mode 100644 index 0000000..c10d99a --- /dev/null +++ b/src/main/resources/templates/views/level2/3.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level2-3
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level3/1.html b/src/main/resources/templates/views/level3/1.html new file mode 100644 index 0000000..62267d3 --- /dev/null +++ b/src/main/resources/templates/views/level3/1.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level3-1
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level3/2.html b/src/main/resources/templates/views/level3/2.html new file mode 100644 index 0000000..dbb1d0f --- /dev/null +++ b/src/main/resources/templates/views/level3/2.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level3-2
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/level3/3.html b/src/main/resources/templates/views/level3/3.html new file mode 100644 index 0000000..e46cd4d --- /dev/null +++ b/src/main/resources/templates/views/level3/3.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是level3-3
+ + \ No newline at end of file diff --git a/src/main/resources/templates/views/login.html b/src/main/resources/templates/views/login.html new file mode 100644 index 0000000..edb2a10 --- /dev/null +++ b/src/main/resources/templates/views/login.html @@ -0,0 +1,10 @@ + + + + + Title + + +
我是登录页
+ + \ No newline at end of file -- libgit2 0.21.2