Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
fadd37ef
Commit
fadd37ef
authored
Aug 06, 2013
by
Phillip Webb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove websocket starter/sample from M1
parent
d82ac896
Pipeline
#396
failed with stages
Changes
21
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
0 additions
and
1476 deletions
+0
-1476
pom.xml
spring-boot-samples/pom.xml
+0
-1
pom.xml
spring-boot-samples/spring-boot-sample-websocket/pom.xml
+0
-59
GreetingService.java
...mework/boot/samples/websocket/client/GreetingService.java
+0
-22
SimpleClientWebSocketHandler.java
...amples/websocket/client/SimpleClientWebSocketHandler.java
+0
-54
SimpleGreetingService.java
.../boot/samples/websocket/client/SimpleGreetingService.java
+0
-25
SampleWebSocketsApplication.java
...samples/websocket/config/SampleWebSocketsApplication.java
+0
-129
DefaultEchoService.java
...ework/boot/samples/websocket/echo/DefaultEchoService.java
+0
-31
EchoService.java
...ingframework/boot/samples/websocket/echo/EchoService.java
+0
-22
EchoWebSocketHandler.java
...ork/boot/samples/websocket/echo/EchoWebSocketHandler.java
+0
-43
Direction.java
...ringframework/boot/samples/websocket/snake/Direction.java
+0
-21
Location.java
...pringframework/boot/samples/websocket/snake/Location.java
+0
-71
Snake.java
...g/springframework/boot/samples/websocket/snake/Snake.java
+0
-139
SnakeTimer.java
...ingframework/boot/samples/websocket/snake/SnakeTimer.java
+0
-107
SnakeUtils.java
...ingframework/boot/samples/websocket/snake/SnakeUtils.java
+0
-56
SnakeWebSocketHandler.java
...k/boot/samples/websocket/snake/SnakeWebSocketHandler.java
+0
-112
echo.html
...boot-sample-websocket/src/main/resources/static/echo.html
+0
-140
index.html
...oot-sample-websocket/src/main/resources/static/index.html
+0
-31
snake.html
...oot-sample-websocket/src/main/resources/static/snake.html
+0
-259
StandardClientApp.java
...mework/boot/samples/websocket/echo/StandardClientApp.java
+0
-85
pom.xml
spring-boot-starters/pom.xml
+0
-1
pom.xml
spring-boot-starters/spring-boot-starter-websocket/pom.xml
+0
-68
No files found.
spring-boot-samples/pom.xml
View file @
fadd37ef
...
@@ -26,7 +26,6 @@
...
@@ -26,7 +26,6 @@
<module>
spring-boot-sample-traditional
</module>
<module>
spring-boot-sample-traditional
</module>
<module>
spring-boot-sample-web-static
</module>
<module>
spring-boot-sample-web-static
</module>
<module>
spring-boot-sample-web-ui
</module>
<module>
spring-boot-sample-web-ui
</module>
<module>
spring-boot-sample-websocket
</module>
<module>
spring-boot-sample-xml
</module>
<module>
spring-boot-sample-xml
</module>
</modules>
</modules>
<build>
<build>
...
...
spring-boot-samples/spring-boot-sample-websocket/pom.xml
deleted
100644 → 0
View file @
d82ac896
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
spring-boot-sample-websocket
</artifactId>
<packaging>
war
</packaging>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
0.5.0.M1
</version>
<relativePath>
../../spring-boot-starters/spring-boot-starter-parent
</relativePath>
</parent>
<properties>
<java.version>
1.7
</java.version>
<tomcat.version>
8.0-SNAPSHOT
</tomcat.version>
<start-class>
org.springframework.boot.samples.websocket.config.ApplicationConfiguration
</start-class>
</properties>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-websocket
</artifactId>
<version>
${spring.boot.version}
</version>
</dependency>
<!-- For SockJS -->
<dependency>
<groupId>
org.eclipse.jetty.websocket
</groupId>
<artifactId>
websocket-client
</artifactId>
<version>
9.0.3.v20130506
</version>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>
tomcat-snapshots
</id>
<url>
https://repository.apache.org/content/repositories/snapshots
</url>
<snapshots>
<enabled>
true
</enabled>
</snapshots>
<releases>
<enabled>
false
</enabled>
</releases>
</repository>
</repositories>
</project>
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/GreetingService.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
client
;
public
interface
GreetingService
{
String
getGreeting
();
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleClientWebSocketHandler.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
client
;
import
java.util.concurrent.CountDownLatch
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.socket.TextMessage
;
import
org.springframework.web.socket.WebSocketSession
;
import
org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter
;
public
class
SimpleClientWebSocketHandler
extends
TextWebSocketHandlerAdapter
{
protected
Log
logger
=
LogFactory
.
getLog
(
SimpleClientWebSocketHandler
.
class
);
private
final
GreetingService
greetingService
;
private
CountDownLatch
latch
;
@Autowired
public
SimpleClientWebSocketHandler
(
GreetingService
greetingService
,
CountDownLatch
latch
)
{
this
.
greetingService
=
greetingService
;
this
.
latch
=
latch
;
}
@Override
public
void
afterConnectionEstablished
(
WebSocketSession
session
)
throws
Exception
{
TextMessage
message
=
new
TextMessage
(
this
.
greetingService
.
getGreeting
());
session
.
sendMessage
(
message
);
}
@Override
public
void
handleTextMessage
(
WebSocketSession
session
,
TextMessage
message
)
throws
Exception
{
logger
.
info
(
"Received: "
+
message
+
" ("
+
latch
.
getCount
()
+
")"
);
session
.
close
();
latch
.
countDown
();
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/client/SimpleGreetingService.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
client
;
public
class
SimpleGreetingService
implements
GreetingService
{
@Override
public
String
getGreeting
()
{
return
"Hello world!"
;
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/config/SampleWebSocketsApplication.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
config
;
import
java.util.HashMap
;
import
java.util.Map
;
import
org.apache.catalina.Context
;
import
org.apache.catalina.startup.Tomcat
;
import
org.apache.tomcat.websocket.server.WsSci
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
;
import
org.springframework.boot.samples.websocket.client.GreetingService
;
import
org.springframework.boot.samples.websocket.client.SimpleGreetingService
;
import
org.springframework.boot.samples.websocket.echo.DefaultEchoService
;
import
org.springframework.boot.samples.websocket.echo.EchoService
;
import
org.springframework.boot.samples.websocket.echo.EchoWebSocketHandler
;
import
org.springframework.boot.samples.websocket.snake.SnakeWebSocketHandler
;
import
org.springframework.boot.web.SpringServletInitializer
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
;
import
org.springframework.web.servlet.DispatcherServlet
;
import
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
;
import
org.springframework.web.socket.WebSocketHandler
;
import
org.springframework.web.socket.server.support.WebSocketHttpRequestHandler
;
import
org.springframework.web.socket.sockjs.SockJsService
;
import
org.springframework.web.socket.sockjs.support.DefaultSockJsService
;
import
org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler
;
import
org.springframework.web.socket.support.PerConnectionWebSocketHandler
;
@Configuration
public
class
SampleWebSocketsApplication
extends
SpringServletInitializer
{
@Override
protected
Class
<?>[]
getConfigClasses
()
{
return
new
Class
<?>[]
{
SampleWebSocketsApplication
.
class
};
}
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
SampleWebSocketsApplication
.
class
,
args
);
}
@ConditionalOnClass
(
Tomcat
.
class
)
@Configuration
@EnableAutoConfiguration
protected
static
class
InitializationConfiguration
{
@Bean
public
TomcatEmbeddedServletContainerFactory
tomcatEmbeddedServletContainerFactory
()
{
TomcatEmbeddedServletContainerFactory
factory
=
new
TomcatEmbeddedServletContainerFactory
()
{
@Override
protected
void
postProcessContext
(
Context
context
)
{
context
.
addServletContainerInitializer
(
new
WsSci
(),
null
);
}
};
return
factory
;
}
}
@Bean
public
EchoService
echoService
()
{
return
new
DefaultEchoService
(
"Did you say \"%s\"?"
);
}
@Bean
public
GreetingService
greetingService
()
{
return
new
SimpleGreetingService
();
}
@Bean
public
SimpleUrlHandlerMapping
handlerMapping
()
{
SockJsService
sockJsService
=
new
DefaultSockJsService
(
sockJsTaskScheduler
());
Map
<
String
,
Object
>
urlMap
=
new
HashMap
<
String
,
Object
>();
urlMap
.
put
(
"/echo"
,
new
WebSocketHttpRequestHandler
(
echoWebSocketHandler
()));
urlMap
.
put
(
"/snake"
,
new
WebSocketHttpRequestHandler
(
snakeWebSocketHandler
()));
urlMap
.
put
(
"/sockjs/echo/**"
,
new
SockJsHttpRequestHandler
(
sockJsService
,
echoWebSocketHandler
()));
urlMap
.
put
(
"/sockjs/snake/**"
,
new
SockJsHttpRequestHandler
(
sockJsService
,
snakeWebSocketHandler
()));
SimpleUrlHandlerMapping
handlerMapping
=
new
SimpleUrlHandlerMapping
();
handlerMapping
.
setOrder
(-
1
);
handlerMapping
.
setUrlMap
(
urlMap
);
return
handlerMapping
;
}
@Bean
public
DispatcherServlet
dispatcherServlet
()
{
DispatcherServlet
servlet
=
new
DispatcherServlet
();
servlet
.
setDispatchOptionsRequest
(
true
);
return
servlet
;
}
@Bean
public
WebSocketHandler
echoWebSocketHandler
()
{
return
new
PerConnectionWebSocketHandler
(
EchoWebSocketHandler
.
class
);
}
@Bean
public
WebSocketHandler
snakeWebSocketHandler
()
{
return
new
SnakeWebSocketHandler
();
}
@Bean
public
ThreadPoolTaskScheduler
sockJsTaskScheduler
()
{
ThreadPoolTaskScheduler
taskScheduler
=
new
ThreadPoolTaskScheduler
();
taskScheduler
.
setThreadNamePrefix
(
"SockJS-"
);
return
taskScheduler
;
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/DefaultEchoService.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
echo
;
public
class
DefaultEchoService
implements
EchoService
{
private
final
String
echoFormat
;
public
DefaultEchoService
(
String
echoFormat
)
{
this
.
echoFormat
=
(
echoFormat
!=
null
)
?
echoFormat
:
"%s"
;
}
@Override
public
String
getMessage
(
String
message
)
{
return
String
.
format
(
this
.
echoFormat
,
message
);
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoService.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
echo
;
public
interface
EchoService
{
String
getMessage
(
String
message
);
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/echo/EchoWebSocketHandler.java
deleted
100644 → 0
View file @
d82ac896
package
org
.
springframework
.
boot
.
samples
.
websocket
.
echo
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.socket.CloseStatus
;
import
org.springframework.web.socket.TextMessage
;
import
org.springframework.web.socket.WebSocketHandler
;
import
org.springframework.web.socket.WebSocketSession
;
import
org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter
;
/**
* Echo messages by implementing a Spring {@link WebSocketHandler} abstraction.
*/
public
class
EchoWebSocketHandler
extends
TextWebSocketHandlerAdapter
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
EchoWebSocketHandler
.
class
);
private
final
EchoService
echoService
;
@Autowired
public
EchoWebSocketHandler
(
EchoService
echoService
)
{
this
.
echoService
=
echoService
;
}
@Override
public
void
afterConnectionEstablished
(
WebSocketSession
session
)
{
logger
.
debug
(
"Opened new session in instance "
+
this
);
}
@Override
public
void
handleTextMessage
(
WebSocketSession
session
,
TextMessage
message
)
throws
Exception
{
String
echoMessage
=
this
.
echoService
.
getMessage
(
message
.
getPayload
());
logger
.
debug
(
echoMessage
);
session
.
sendMessage
(
new
TextMessage
(
echoMessage
));
}
@Override
public
void
handleTransportError
(
WebSocketSession
session
,
Throwable
exception
)
throws
Exception
{
session
.
close
(
CloseStatus
.
SERVER_ERROR
);
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Direction.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
public
enum
Direction
{
NONE
,
NORTH
,
SOUTH
,
EAST
,
WEST
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Location.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
import
org.springframework.boot.samples.websocket.snake.Direction
;
public
class
Location
{
public
int
x
;
public
int
y
;
public
static
final
int
GRID_SIZE
=
10
;
public
static
final
int
PLAYFIELD_HEIGHT
=
480
;
public
static
final
int
PLAYFIELD_WIDTH
=
640
;
public
Location
(
int
x
,
int
y
)
{
this
.
x
=
x
;
this
.
y
=
y
;
}
public
Location
getAdjacentLocation
(
Direction
direction
)
{
switch
(
direction
)
{
case
NORTH:
return
new
Location
(
x
,
y
-
Location
.
GRID_SIZE
);
case
SOUTH:
return
new
Location
(
x
,
y
+
Location
.
GRID_SIZE
);
case
EAST:
return
new
Location
(
x
+
Location
.
GRID_SIZE
,
y
);
case
WEST:
return
new
Location
(
x
-
Location
.
GRID_SIZE
,
y
);
case
NONE:
// fall through
default
:
return
this
;
}
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(
this
==
o
)
return
true
;
if
(
o
==
null
||
getClass
()
!=
o
.
getClass
())
return
false
;
Location
location
=
(
Location
)
o
;
if
(
x
!=
location
.
x
)
return
false
;
if
(
y
!=
location
.
y
)
return
false
;
return
true
;
}
@Override
public
int
hashCode
()
{
int
result
=
x
;
result
=
31
*
result
+
y
;
return
result
;
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/Snake.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
import
java.util.ArrayDeque
;
import
java.util.Collection
;
import
java.util.Deque
;
import
org.springframework.web.socket.TextMessage
;
import
org.springframework.web.socket.WebSocketSession
;
public
class
Snake
{
private
static
final
int
DEFAULT_LENGTH
=
5
;
private
final
int
id
;
private
final
WebSocketSession
session
;
private
Direction
direction
;
private
int
length
=
DEFAULT_LENGTH
;
private
Location
head
;
private
final
Deque
<
Location
>
tail
=
new
ArrayDeque
<
Location
>();
private
final
String
hexColor
;
public
Snake
(
int
id
,
WebSocketSession
session
)
{
this
.
id
=
id
;
this
.
session
=
session
;
this
.
hexColor
=
SnakeUtils
.
getRandomHexColor
();
resetState
();
}
private
void
resetState
()
{
this
.
direction
=
Direction
.
NONE
;
this
.
head
=
SnakeUtils
.
getRandomLocation
();
this
.
tail
.
clear
();
this
.
length
=
DEFAULT_LENGTH
;
}
private
synchronized
void
kill
()
throws
Exception
{
resetState
();
sendMessage
(
"{'type': 'dead'}"
);
}
private
synchronized
void
reward
()
throws
Exception
{
length
++;
sendMessage
(
"{'type': 'kill'}"
);
}
protected
void
sendMessage
(
String
msg
)
throws
Exception
{
session
.
sendMessage
(
new
TextMessage
(
msg
));
}
public
synchronized
void
update
(
Collection
<
Snake
>
snakes
)
throws
Exception
{
Location
nextLocation
=
head
.
getAdjacentLocation
(
direction
);
if
(
nextLocation
.
x
>=
SnakeUtils
.
PLAYFIELD_WIDTH
)
{
nextLocation
.
x
=
0
;
}
if
(
nextLocation
.
y
>=
SnakeUtils
.
PLAYFIELD_HEIGHT
)
{
nextLocation
.
y
=
0
;
}
if
(
nextLocation
.
x
<
0
)
{
nextLocation
.
x
=
SnakeUtils
.
PLAYFIELD_WIDTH
;
}
if
(
nextLocation
.
y
<
0
)
{
nextLocation
.
y
=
SnakeUtils
.
PLAYFIELD_HEIGHT
;
}
if
(
direction
!=
Direction
.
NONE
)
{
tail
.
addFirst
(
head
);
if
(
tail
.
size
()
>
length
)
{
tail
.
removeLast
();
}
head
=
nextLocation
;
}
handleCollisions
(
snakes
);
}
private
void
handleCollisions
(
Collection
<
Snake
>
snakes
)
throws
Exception
{
for
(
Snake
snake
:
snakes
)
{
boolean
headCollision
=
id
!=
snake
.
id
&&
snake
.
getHead
().
equals
(
head
);
boolean
tailCollision
=
snake
.
getTail
().
contains
(
head
);
if
(
headCollision
||
tailCollision
)
{
kill
();
if
(
id
!=
snake
.
id
)
{
snake
.
reward
();
}
}
}
}
public
synchronized
Location
getHead
()
{
return
head
;
}
public
synchronized
Collection
<
Location
>
getTail
()
{
return
tail
;
}
public
synchronized
void
setDirection
(
Direction
direction
)
{
this
.
direction
=
direction
;
}
public
synchronized
String
getLocationsJson
()
{
StringBuilder
sb
=
new
StringBuilder
();
sb
.
append
(
String
.
format
(
"{x: %d, y: %d}"
,
Integer
.
valueOf
(
head
.
x
),
Integer
.
valueOf
(
head
.
y
)));
for
(
Location
location
:
tail
)
{
sb
.
append
(
','
);
sb
.
append
(
String
.
format
(
"{x: %d, y: %d}"
,
Integer
.
valueOf
(
location
.
x
),
Integer
.
valueOf
(
location
.
y
)));
}
return
String
.
format
(
"{'id':%d,'body':[%s]}"
,
Integer
.
valueOf
(
id
),
sb
.
toString
());
}
public
int
getId
()
{
return
id
;
}
public
String
getHexColor
()
{
return
hexColor
;
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeTimer.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Iterator
;
import
java.util.Timer
;
import
java.util.TimerTask
;
import
java.util.concurrent.ConcurrentHashMap
;
import
org.apache.juli.logging.Log
;
import
org.apache.juli.logging.LogFactory
;
/**
* Sets up the timer for the multi-player snake game WebSocket example.
*/
public
class
SnakeTimer
{
private
static
final
Log
log
=
LogFactory
.
getLog
(
SnakeTimer
.
class
);
private
static
Timer
gameTimer
=
null
;
private
static
final
long
TICK_DELAY
=
100
;
private
static
final
ConcurrentHashMap
<
Integer
,
Snake
>
snakes
=
new
ConcurrentHashMap
<
Integer
,
Snake
>();
public
static
synchronized
void
addSnake
(
Snake
snake
)
{
if
(
snakes
.
size
()
==
0
)
{
startTimer
();
}
snakes
.
put
(
Integer
.
valueOf
(
snake
.
getId
()),
snake
);
}
public
static
Collection
<
Snake
>
getSnakes
()
{
return
Collections
.
unmodifiableCollection
(
snakes
.
values
());
}
public
static
synchronized
void
removeSnake
(
Snake
snake
)
{
snakes
.
remove
(
Integer
.
valueOf
(
snake
.
getId
()));
if
(
snakes
.
size
()
==
0
)
{
stopTimer
();
}
}
public
static
void
tick
()
throws
Exception
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
Iterator
<
Snake
>
iterator
=
SnakeTimer
.
getSnakes
().
iterator
();
iterator
.
hasNext
();)
{
Snake
snake
=
iterator
.
next
();
snake
.
update
(
SnakeTimer
.
getSnakes
());
sb
.
append
(
snake
.
getLocationsJson
());
if
(
iterator
.
hasNext
())
{
sb
.
append
(
','
);
}
}
broadcast
(
String
.
format
(
"{'type': 'update', 'data' : [%s]}"
,
sb
.
toString
()));
}
public
static
void
broadcast
(
String
message
)
throws
Exception
{
for
(
Snake
snake
:
SnakeTimer
.
getSnakes
())
{
snake
.
sendMessage
(
message
);
}
}
public
static
void
startTimer
()
{
gameTimer
=
new
Timer
(
SnakeTimer
.
class
.
getSimpleName
()
+
" Timer"
);
gameTimer
.
scheduleAtFixedRate
(
new
TimerTask
()
{
@Override
public
void
run
()
{
try
{
tick
();
}
catch
(
Throwable
e
)
{
log
.
error
(
"Caught to prevent timer from shutting down"
,
e
);
}
}
},
TICK_DELAY
,
TICK_DELAY
);
}
public
static
void
stopTimer
()
{
if
(
gameTimer
!=
null
)
{
gameTimer
.
cancel
();
}
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeUtils.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
import
java.awt.Color
;
import
java.util.Random
;
public
class
SnakeUtils
{
public
static
final
int
PLAYFIELD_WIDTH
=
640
;
public
static
final
int
PLAYFIELD_HEIGHT
=
480
;
public
static
final
int
GRID_SIZE
=
10
;
private
static
final
Random
random
=
new
Random
();
public
static
String
getRandomHexColor
()
{
float
hue
=
random
.
nextFloat
();
// sat between 0.1 and 0.3
float
saturation
=
(
random
.
nextInt
(
2000
)
+
1000
)
/
10000
f
;
float
luminance
=
0.9f
;
Color
color
=
Color
.
getHSBColor
(
hue
,
saturation
,
luminance
);
return
'#'
+
Integer
.
toHexString
(
(
color
.
getRGB
()
&
0xffffff
)
|
0x1000000
).
substring
(
1
);
}
public
static
Location
getRandomLocation
()
{
int
x
=
roundByGridSize
(
random
.
nextInt
(
PLAYFIELD_WIDTH
));
int
y
=
roundByGridSize
(
random
.
nextInt
(
PLAYFIELD_HEIGHT
));
return
new
Location
(
x
,
y
);
}
private
static
int
roundByGridSize
(
int
value
)
{
value
=
value
+
(
GRID_SIZE
/
2
);
value
=
value
/
GRID_SIZE
;
value
=
value
*
GRID_SIZE
;
return
value
;
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/java/org/springframework/boot/samples/websocket/snake/SnakeWebSocketHandler.java
deleted
100644 → 0
View file @
d82ac896
/*
* 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
snake
;
import
java.awt.Color
;
import
java.util.Iterator
;
import
java.util.Random
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
org.springframework.web.socket.CloseStatus
;
import
org.springframework.web.socket.TextMessage
;
import
org.springframework.web.socket.WebSocketSession
;
import
org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter
;
public
class
SnakeWebSocketHandler
extends
TextWebSocketHandlerAdapter
{
public
static
final
int
PLAYFIELD_WIDTH
=
640
;
public
static
final
int
PLAYFIELD_HEIGHT
=
480
;
public
static
final
int
GRID_SIZE
=
10
;
private
static
final
AtomicInteger
snakeIds
=
new
AtomicInteger
(
0
);
private
static
final
Random
random
=
new
Random
();
private
final
int
id
;
private
Snake
snake
;
public
static
String
getRandomHexColor
()
{
float
hue
=
random
.
nextFloat
();
// sat between 0.1 and 0.3
float
saturation
=
(
random
.
nextInt
(
2000
)
+
1000
)
/
10000
f
;
float
luminance
=
0.9f
;
Color
color
=
Color
.
getHSBColor
(
hue
,
saturation
,
luminance
);
return
'#'
+
Integer
.
toHexString
(
(
color
.
getRGB
()
&
0xffffff
)
|
0x1000000
).
substring
(
1
);
}
public
static
Location
getRandomLocation
()
{
int
x
=
roundByGridSize
(
random
.
nextInt
(
PLAYFIELD_WIDTH
));
int
y
=
roundByGridSize
(
random
.
nextInt
(
PLAYFIELD_HEIGHT
));
return
new
Location
(
x
,
y
);
}
private
static
int
roundByGridSize
(
int
value
)
{
value
=
value
+
(
GRID_SIZE
/
2
);
value
=
value
/
GRID_SIZE
;
value
=
value
*
GRID_SIZE
;
return
value
;
}
public
SnakeWebSocketHandler
()
{
this
.
id
=
snakeIds
.
getAndIncrement
();
}
@Override
public
void
afterConnectionEstablished
(
WebSocketSession
session
)
throws
Exception
{
this
.
snake
=
new
Snake
(
id
,
session
);
SnakeTimer
.
addSnake
(
snake
);
StringBuilder
sb
=
new
StringBuilder
();
for
(
Iterator
<
Snake
>
iterator
=
SnakeTimer
.
getSnakes
().
iterator
();
iterator
.
hasNext
();)
{
Snake
snake
=
iterator
.
next
();
sb
.
append
(
String
.
format
(
"{id: %d, color: '%s'}"
,
Integer
.
valueOf
(
snake
.
getId
()),
snake
.
getHexColor
()));
if
(
iterator
.
hasNext
())
{
sb
.
append
(
','
);
}
}
SnakeTimer
.
broadcast
(
String
.
format
(
"{'type': 'join','data':[%s]}"
,
sb
.
toString
()));
}
@Override
protected
void
handleTextMessage
(
WebSocketSession
session
,
TextMessage
message
)
throws
Exception
{
String
payload
=
message
.
getPayload
();
if
(
"west"
.
equals
(
payload
))
{
snake
.
setDirection
(
Direction
.
WEST
);
}
else
if
(
"north"
.
equals
(
payload
))
{
snake
.
setDirection
(
Direction
.
NORTH
);
}
else
if
(
"east"
.
equals
(
payload
))
{
snake
.
setDirection
(
Direction
.
EAST
);
}
else
if
(
"south"
.
equals
(
payload
))
{
snake
.
setDirection
(
Direction
.
SOUTH
);
}
}
@Override
public
void
afterConnectionClosed
(
WebSocketSession
session
,
CloseStatus
status
)
throws
Exception
{
SnakeTimer
.
removeSnake
(
snake
);
SnakeTimer
.
broadcast
(
String
.
format
(
"{'type': 'leave', 'id': %d}"
,
Integer
.
valueOf
(
id
)));
}
}
spring-boot-samples/spring-boot-sample-websocket/src/main/resources/static/echo.html
deleted
100644 → 0
View file @
d82ac896
<!--
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
http://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.
-->
<!DOCTYPE html>
<html>
<head>
<title>
Apache Tomcat WebSocket Examples: Echo
</title>
<style
type=
"text/css"
>
#connect-container
{
float
:
left
;
width
:
400px
}
#connect-container
div
{
padding
:
5px
;
}
#console-container
{
float
:
left
;
margin-left
:
15px
;
width
:
400px
;
}
#console
{
border
:
1px
solid
#CCCCCC
;
border-right-color
:
#999999
;
border-bottom-color
:
#999999
;
height
:
170px
;
overflow-y
:
scroll
;
padding
:
5px
;
width
:
100%
;
}
#console
p
{
padding
:
0
;
margin
:
0
;
}
</style>
<script
type=
"text/javascript"
>
var
ws
=
null
;
function
setConnected
(
connected
)
{
document
.
getElementById
(
'connect'
).
disabled
=
connected
;
document
.
getElementById
(
'disconnect'
).
disabled
=
!
connected
;
document
.
getElementById
(
'echo'
).
disabled
=
!
connected
;
}
function
connect
()
{
var
target
=
document
.
getElementById
(
'target'
).
value
;
target
=
"ws://"
+
window
.
location
.
host
+
target
if
(
'WebSocket'
in
window
)
{
ws
=
new
WebSocket
(
target
);
}
else
if
(
'MozWebSocket'
in
window
)
{
ws
=
new
MozWebSocket
(
target
);
}
else
{
alert
(
'WebSocket is not supported by this browser.'
);
return
;
}
ws
.
onopen
=
function
()
{
setConnected
(
true
);
log
(
'Info: WebSocket connection opened.'
);
};
ws
.
onmessage
=
function
(
event
)
{
log
(
'Received: '
+
event
.
data
);
};
ws
.
onclose
=
function
()
{
setConnected
(
false
);
log
(
'Info: WebSocket connection closed.'
);
};
}
function
disconnect
()
{
if
(
ws
!=
null
)
{
ws
.
close
();
ws
=
null
;
}
setConnected
(
false
);
}
function
echo
()
{
if
(
ws
!=
null
)
{
var
message
=
document
.
getElementById
(
'message'
).
value
;
log
(
'Sent: '
+
message
);
ws
.
send
(
message
);
}
else
{
alert
(
'WebSocket connection not established, please connect.'
);
}
}
function
log
(
message
)
{
var
console
=
document
.
getElementById
(
'console'
);
var
p
=
document
.
createElement
(
'p'
);
p
.
style
.
wordWrap
=
'break-word'
;
p
.
appendChild
(
document
.
createTextNode
(
message
));
console
.
appendChild
(
p
);
while
(
console
.
childNodes
.
length
>
25
)
{
console
.
removeChild
(
console
.
firstChild
);
}
console
.
scrollTop
=
console
.
scrollHeight
;
}
</script>
</head>
<body>
<noscript><h2
style=
"color: #ff0000"
>
Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable
Javascript and reload this page!
</h2></noscript>
<div>
<div
id=
"connect-container"
>
<div>
<input
id=
"target"
type=
"text"
size=
"40"
style=
"width: 350px"
value=
"/echo"
/>
</div>
<div>
<button
id=
"connect"
onclick=
"connect();"
>
Connect
</button>
<button
id=
"disconnect"
disabled=
"disabled"
onclick=
"disconnect();"
>
Disconnect
</button>
</div>
<div>
<textarea
id=
"message"
style=
"width: 350px"
>
Here is a message!
</textarea>
</div>
<div>
<button
id=
"echo"
onclick=
"echo();"
disabled=
"disabled"
>
Echo message
</button>
</div>
</div>
<div
id=
"console-container"
>
<div
id=
"console"
></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
spring-boot-samples/spring-boot-sample-websocket/src/main/resources/static/index.html
deleted
100644 → 0
View file @
d82ac896
<!--
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
http://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.
-->
<!DOCTYPE html>
<html>
<head>
<title>
Apache Tomcat WebSocket Examples: Index
</title>
</head>
<body>
<noscript><h2
style=
"color: #ff0000"
>
Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable
Javascript and reload this page!
</h2></noscript>
<p>
Please select the sample you would like to try.
</p>
<ul>
<li><a
href=
"./echo.html"
>
Echo
</a></li>
<li><a
href=
"./snake.html"
>
Snake
</a></li>
</ul>
</body>
</html>
\ No newline at end of file
spring-boot-samples/spring-boot-sample-websocket/src/main/resources/static/snake.html
deleted
100644 → 0
View file @
d82ac896
<!--
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
http://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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns=
"http://www.w3.org/1999/xhtml"
lang=
"en"
xml:lang=
"en"
>
<head>
<meta
http-equiv=
"Content-Type"
content=
"text/html; charset=utf-8"
/>
<title>
Apache Tomcat WebSocket Examples: Multiplayer Snake
</title>
<style
type=
"text/css"
>
#playground
{
width
:
640px
;
height
:
480px
;
background-color
:
#000
;
}
#console-container
{
float
:
left
;
margin-left
:
15px
;
width
:
300px
;
}
#console
{
border
:
1px
solid
#CCCCCC
;
border-right-color
:
#999999
;
border-bottom-color
:
#999999
;
height
:
480px
;
overflow-y
:
scroll
;
padding-left
:
5px
;
padding-right
:
5px
;
width
:
100%
;
}
#console
p
{
padding
:
0
;
margin
:
0
;
}
</style>
</head>
<body>
<noscript><h2
style=
"color: #ff0000"
>
Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable
Javascript and reload this page!
</h2></noscript>
<div
style=
"float: left"
>
<canvas
id=
"playground"
width=
"640"
height=
"480"
></canvas>
</div>
<div
id=
"console-container"
>
<div
id=
"console"
></div>
</div>
<script
type=
"text/javascript"
>
var
Game
=
{};
Game
.
fps
=
30
;
Game
.
socket
=
null
;
Game
.
nextFrame
=
null
;
Game
.
interval
=
null
;
Game
.
direction
=
'none'
;
Game
.
gridSize
=
10
;
function
Snake
()
{
this
.
snakeBody
=
[];
this
.
color
=
null
;
}
Snake
.
prototype
.
draw
=
function
(
context
)
{
for
(
var
id
in
this
.
snakeBody
)
{
context
.
fillStyle
=
this
.
color
;
context
.
fillRect
(
this
.
snakeBody
[
id
].
x
,
this
.
snakeBody
[
id
].
y
,
Game
.
gridSize
,
Game
.
gridSize
);
}
};
Game
.
initialize
=
function
()
{
this
.
entities
=
[];
canvas
=
document
.
getElementById
(
'playground'
);
if
(
!
canvas
.
getContext
)
{
Console
.
log
(
'Error: 2d canvas not supported by this browser.'
);
return
;
}
this
.
context
=
canvas
.
getContext
(
'2d'
);
window
.
addEventListener
(
'keydown'
,
function
(
e
)
{
var
code
=
e
.
keyCode
;
if
(
code
>
36
&&
code
<
41
)
{
switch
(
code
)
{
case
37
:
if
(
Game
.
direction
!=
'east'
)
Game
.
setDirection
(
'west'
);
break
;
case
38
:
if
(
Game
.
direction
!=
'south'
)
Game
.
setDirection
(
'north'
);
break
;
case
39
:
if
(
Game
.
direction
!=
'west'
)
Game
.
setDirection
(
'east'
);
break
;
case
40
:
if
(
Game
.
direction
!=
'north'
)
Game
.
setDirection
(
'south'
);
break
;
}
}
},
false
);
if
(
window
.
location
.
protocol
==
'http:'
)
{
Game
.
connect
(
'ws://'
+
window
.
location
.
host
+
'/snake'
);
}
else
{
Game
.
connect
(
'wss://'
+
window
.
location
.
host
+
'/snake'
);
}
};
Game
.
setDirection
=
function
(
direction
)
{
Game
.
direction
=
direction
;
Game
.
socket
.
send
(
direction
);
Console
.
log
(
'Sent: Direction '
+
direction
);
};
Game
.
startGameLoop
=
function
()
{
if
(
window
.
webkitRequestAnimationFrame
)
{
Game
.
nextFrame
=
function
()
{
webkitRequestAnimationFrame
(
Game
.
run
);
};
}
else
if
(
window
.
mozRequestAnimationFrame
)
{
Game
.
nextFrame
=
function
()
{
mozRequestAnimationFrame
(
Game
.
run
);
};
}
else
{
Game
.
interval
=
setInterval
(
Game
.
run
,
1000
/
Game
.
fps
);
}
if
(
Game
.
nextFrame
!=
null
)
{
Game
.
nextFrame
();
}
};
Game
.
stopGameLoop
=
function
()
{
Game
.
nextFrame
=
null
;
if
(
Game
.
interval
!=
null
)
{
clearInterval
(
Game
.
interval
);
}
};
Game
.
draw
=
function
()
{
this
.
context
.
clearRect
(
0
,
0
,
640
,
480
);
for
(
var
id
in
this
.
entities
)
{
this
.
entities
[
id
].
draw
(
this
.
context
);
}
};
Game
.
addSnake
=
function
(
id
,
color
)
{
Game
.
entities
[
id
]
=
new
Snake
();
Game
.
entities
[
id
].
color
=
color
;
};
Game
.
updateSnake
=
function
(
id
,
snakeBody
)
{
if
(
typeof
Game
.
entities
[
id
]
!=
"undefined"
)
{
Game
.
entities
[
id
].
snakeBody
=
snakeBody
;
}
};
Game
.
removeSnake
=
function
(
id
)
{
Game
.
entities
[
id
]
=
null
;
// Force GC.
delete
Game
.
entities
[
id
];
};
Game
.
run
=
(
function
()
{
var
skipTicks
=
1000
/
Game
.
fps
,
nextGameTick
=
(
new
Date
).
getTime
();
return
function
()
{
while
((
new
Date
).
getTime
()
>
nextGameTick
)
{
nextGameTick
+=
skipTicks
;
}
Game
.
draw
();
if
(
Game
.
nextFrame
!=
null
)
{
Game
.
nextFrame
();
}
};
})();
Game
.
connect
=
(
function
(
host
)
{
if
(
'WebSocket'
in
window
)
{
Game
.
socket
=
new
WebSocket
(
host
);
}
else
if
(
'MozWebSocket'
in
window
)
{
Game
.
socket
=
new
MozWebSocket
(
host
);
}
else
{
Console
.
log
(
'Error: WebSocket is not supported by this browser.'
);
return
;
}
Game
.
socket
.
onopen
=
function
()
{
// Socket open.. start the game loop.
Console
.
log
(
'Info: WebSocket connection opened.'
);
Console
.
log
(
'Info: Press an arrow key to begin.'
);
Game
.
startGameLoop
();
setInterval
(
function
()
{
// Prevent server read timeout.
Game
.
socket
.
send
(
'ping'
);
},
5000
);
};
Game
.
socket
.
onclose
=
function
()
{
Console
.
log
(
'Info: WebSocket closed.'
);
Game
.
stopGameLoop
();
};
Game
.
socket
.
onmessage
=
function
(
message
)
{
// _Potential_ security hole, consider using json lib to parse data in production.
var
packet
=
eval
(
'('
+
message
.
data
+
')'
);
switch
(
packet
.
type
)
{
case
'update'
:
for
(
var
i
=
0
;
i
<
packet
.
data
.
length
;
i
++
)
{
Game
.
updateSnake
(
packet
.
data
[
i
].
id
,
packet
.
data
[
i
].
body
);
}
break
;
case
'join'
:
for
(
var
j
=
0
;
j
<
packet
.
data
.
length
;
j
++
)
{
Game
.
addSnake
(
packet
.
data
[
j
].
id
,
packet
.
data
[
j
].
color
);
}
break
;
case
'leave'
:
Game
.
removeSnake
(
packet
.
id
);
break
;
case
'dead'
:
Console
.
log
(
'Info: Your snake is dead, bad luck!'
);
Game
.
direction
=
'none'
;
break
;
case
'kill'
:
Console
.
log
(
'Info: Head shot!'
);
break
;
}
};
});
var
Console
=
{};
Console
.
log
=
(
function
(
message
)
{
var
console
=
document
.
getElementById
(
'console'
);
var
p
=
document
.
createElement
(
'p'
);
p
.
style
.
wordWrap
=
'break-word'
;
p
.
innerHTML
=
message
;
console
.
appendChild
(
p
);
while
(
console
.
childNodes
.
length
>
25
)
{
console
.
removeChild
(
console
.
firstChild
);
}
console
.
scrollTop
=
console
.
scrollHeight
;
});
Game
.
initialize
();
</script>
</body>
</html>
spring-boot-samples/spring-boot-sample-websocket/src/test/java/org/springframework/boot/samples/websocket/echo/StandardClientApp.java
deleted
100644 → 0
View file @
d82ac896
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed 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
*
* http://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.
*/
package
org
.
springframework
.
boot
.
samples
.
websocket
.
echo
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
java.util.concurrent.CountDownLatch
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.junit.Test
;
import
org.springframework.boot.CommandLineRunner
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.samples.websocket.client.GreetingService
;
import
org.springframework.boot.samples.websocket.client.SimpleClientWebSocketHandler
;
import
org.springframework.boot.samples.websocket.client.SimpleGreetingService
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.socket.client.WebSocketConnectionManager
;
import
org.springframework.web.socket.client.endpoint.StandardWebSocketClient
;
public
class
StandardClientApp
{
private
static
Log
logger
=
LogFactory
.
getLog
(
StandardClientApp
.
class
);
private
static
final
String
WS_URI
=
"ws://localhost:8080/echo"
;
@Test
public
void
runAndWait
()
throws
Exception
{
ApplicationContext
context
=
SpringApplication
.
run
(
ClientConfiguration
.
class
,
"--spring.main.web_environment=false"
);
assertEquals
(
0
,
context
.
getBean
(
ClientConfiguration
.
class
).
latch
.
getCount
());
}
@Configuration
static
class
ClientConfiguration
implements
CommandLineRunner
{
private
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
@Override
public
void
run
(
String
...
args
)
throws
Exception
{
logger
.
info
(
"Waiting for response: latch="
+
latch
.
getCount
());
latch
.
await
();
logger
.
info
(
"Got response: latch="
+
latch
.
getCount
());
}
@Bean
public
WebSocketConnectionManager
wsConnectionManager
()
{
WebSocketConnectionManager
manager
=
new
WebSocketConnectionManager
(
client
(),
handler
(),
WS_URI
);
manager
.
setAutoStartup
(
true
);
return
manager
;
}
@Bean
public
StandardWebSocketClient
client
()
{
return
new
StandardWebSocketClient
();
}
@Bean
public
SimpleClientWebSocketHandler
handler
()
{
return
new
SimpleClientWebSocketHandler
(
greetingService
(),
latch
);
}
@Bean
public
GreetingService
greetingService
()
{
return
new
SimpleGreetingService
();
}
}
}
spring-boot-starters/pom.xml
View file @
fadd37ef
...
@@ -25,7 +25,6 @@
...
@@ -25,7 +25,6 @@
<module>
spring-boot-starter-security
</module>
<module>
spring-boot-starter-security
</module>
<module>
spring-boot-starter-tomcat
</module>
<module>
spring-boot-starter-tomcat
</module>
<module>
spring-boot-starter-web
</module>
<module>
spring-boot-starter-web
</module>
<module>
spring-boot-starter-websocket
</module>
</modules>
</modules>
<build>
<build>
<plugins>
<plugins>
...
...
spring-boot-starters/spring-boot-starter-websocket/pom.xml
deleted
100644 → 0
View file @
d82ac896
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starters
</artifactId>
<version>
0.5.0.M1
</version>
</parent>
<artifactId>
spring-boot-starter-websocket
</artifactId>
<packaging>
jar
</packaging>
<properties>
<main.basedir>
${basedir}/../..
</main.basedir>
<tomcat.version>
8.0-SNAPSHOT
</tomcat.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.apache.tomcat.embed
</groupId>
<artifactId>
tomcat-embed-core
</artifactId>
<version>
${tomcat.version}
</version>
</dependency>
<dependency>
<groupId>
org.apache.tomcat.embed
</groupId>
<artifactId>
tomcat-embed-logging-juli
</artifactId>
<version>
${tomcat.version}
</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>
${project.groupId}
</groupId>
<artifactId>
spring-boot-up-web
</artifactId>
<version>
${project.version}
</version>
<exclusions>
<exclusion>
<groupId>
${project.groupId}
</groupId>
<artifactId>
spring-boot-up-tomcat
</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-websocket
</artifactId>
<version>
${spring.version}
</version>
</dependency>
<dependency>
<groupId>
org.apache.tomcat.embed
</groupId>
<artifactId>
tomcat-embed-core
</artifactId>
</dependency>
<dependency>
<groupId>
org.apache.tomcat.embed
</groupId>
<artifactId>
tomcat-embed-logging-juli
</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>
tomcat-snapshots
</id>
<url>
https://repository.apache.org/content/repositories/snapshots
</url>
<snapshots>
<enabled>
true
</enabled>
</snapshots>
<releases>
<enabled>
false
</enabled>
</releases>
</repository>
</repositories>
</project>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment