Java中的PlayN websocket实现是否正常工作?
根据平台状态,它应该。我正在尝试完成一个基本的Hello World概念验证,但是我无法让我的Java客户端用PlayN连接到我的服务器。只要调用createWebSocket(),就会调用onClose()。然而,我能够使用标准html页面连接到我的服务器 客户端代码:Java中的PlayN websocket实现是否正常工作?,playn,Playn,根据平台状态,它应该。我正在尝试完成一个基本的Hello World概念验证,但是我无法让我的Java客户端用PlayN连接到我的服务器。只要调用createWebSocket(),就会调用onClose()。然而,我能够使用标准html页面连接到我的服务器 客户端代码: WebSocket s = PlayN.net().createWebSocket("ws://localhost:8080/test", new Net.WebSocket.Listener(){ publi
WebSocket s = PlayN.net().createWebSocket("ws://localhost:8080/test", new Net.WebSocket.Listener(){
public void onClose() {System.out.println("close");};
public void onDataMessage(ByteBuffer msg) {System.out.println("data");};
public void onError(String reason) {System.out.println("error");};
public void onOpen() {System.out.println("open");};
public void onTextMessage(String msg) { System.out.println("text");};
});
以下是Jetty上的WebSocket Servlet实现示例:
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketFactory;
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private WebSocketFactory wsFactory;
private final Set<SampleWebSocket> members = new CopyOnWriteArraySet<SampleWebSocket>();
@Override
public void init() throws ServletException {
wsFactory = new WebSocketFactory( new WebSocketFactory.Acceptor() {
@Override
public boolean checkOrigin( final HttpServletRequest request, final String origin ) {
// Allow all origins
return true;
}
@Override
public WebSocket doWebSocketConnect( final HttpServletRequest request, final String protocol ) {
return new SampleWebSocket();
}
} );
wsFactory.setBufferSize( 4096 );
wsFactory.setMaxIdleTime( 60000 );
}
@Override
protected void doGet( final HttpServletRequest request, final HttpServletResponse response ) throws IOException {
if ( wsFactory.acceptWebSocket( request, response ) ) {
return;
}
response.sendError( HttpServletResponse.SC_SERVICE_UNAVAILABLE, "Websocket only" );
}
public class SampleWebSocket implements WebSocket.OnTextMessage {
private volatile Connection connection;
public SampleWebSocket( ) {
}
@Override
public void onClose( final int closeCode, final String message ) {
members.remove( this );
System.out.println( "onClose: closeCode=" +closeCode+ ", message: '" +message+ "'" );
}
@Override
public void onOpen( final Connection connection ) {
this.connection = connection;
System.out.println( "onOpen: connection=" +connection );
members.add( this );
// Send sample binary message back
try {
connection.sendMessage( "Sample message" );
} catch ( final IOException e ) {
e.printStackTrace();
}
}
@Override
public void onMessage( final String data ) {
System.out.println( "onMessage: data=" +data );
// Relay message to other connected clients
for ( final SampleWebSocket member: members ) {
try {
member.connection.sendMessage( data );
} catch ( final IOException e ) {
e.printStackTrace();
}
}
}
}
}
import java.io.IOException;
导入java.util.Set;
导入java.util.concurrent.CopyOnWriteArraySet;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.eclipse.jetty.websocket.websocket;
导入org.eclipse.jetty.websocket.WebSocketFactory;
公共类SampleServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
私人WebSocketFactory wsFactory;
私有最终集成员=新CopyOnWriteArraySet();
@凌驾
public void init()引发ServletException{
wsFactory=newWebSocketFactory(newWebSocketFactory.Acceptor(){
@凌驾
公共布尔校验源(最终HttpServletRequest请求,最终字符串源){
//允许所有来源
返回true;
}
@凌驾
公共WebSocket doWebSocketConnect(最终HttpServletRequest请求,最终字符串协议){
返回新的SampleWebSocket();
}
} );
wsFactory.setBufferSize(4096);
wsFactory.setMaxIdleTime(60000);
}
@凌驾
受保护的void doGet(最终HttpServletRequest请求、最终HttpServletResponse响应)引发IOException{
if(wsFactory.acceptWebSocket(请求、响应)){
返回;
}
response.senderro(HttpServletResponse.SC_服务不可用,“仅限Websocket”);
}
公共类SampleWebSocket实现WebSocket.OnTextMessage{
私有易失性连接;
公共样本WebSocket(){
}
@凌驾
公共void onClose(最终int closeCode,最终字符串消息){
成员。删除(本);
System.out.println(“onClose:closeCode=“+closeCode+”,message:“+message+”);
}
@凌驾
公共无效onOpen(最终连接){
这个连接=连接;
System.out.println(“onOpen:connection=“+connection”);
加入(本条);
//将示例二进制消息发送回
试一试{
connection.sendMessage(“示例消息”);
}捕获(最终IOE例外){
e、 printStackTrace();
}
}
@凌驾
消息上的公共void(最终字符串数据){
System.out.println(“onMessage:data=“+data”);
//将消息中继到其他连接的客户端
用于(最终样本WebSocket成员:成员){
试一试{
成员.连接.发送消息(数据);
}捕获(最终IOE例外){
e、 printStackTrace();
}
}
}
}
}
我终于找到了问题所在。PlayN的1.4版使用Draft10 dy默认值。我已经更新了PlayN的本地副本以供使用:我将默认草稿更改为Draft17,它可以连接到Tomcat