netty 프레임 작업 버전 4.1.6을 사용하여 websocket 서버를 개발 중입니다. 내가 netty example site 에서 샘플 코드를 사용하고 이 내 서버의 소스 코드 :자바 스크립트 클라이언트와 netty 서버 간의 안전한 웹 소켓 연결
public class WebSocketServer
{
static final int PORT = 4466;
public static void main(String[] args)
{
final SslContext sslCtx;
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
SelfSignedCertificate ssc = new SelfSignedCertificate();
sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new WebSocketServerInitializer(sslCtx));
Channel ch = b.bind(PORT).sync().channel();
System.out.println("Open your web browser and navigate to " +
"http://127.0.0.1:" + PORT + '/');
ch.closeFuture().sync();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
WebSocketServerInitializer 소스 코드 :
<html>
<head>
<script type="text/javascript">
// Let us open a web socket
var ws = null;
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert("WebSocket is supported by your Browser!");
// Let us open a web socket
ws = new WebSocket("wss://localhost:4466/websocket");
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("Message to send");
alert("Message is sent...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert(received_msg);
//alert("Message is received...");
};
ws.onclose = function()
{
// websocket is closed.
alert("Connection is closed...");
};
window.onbeforeunload = function(event) {
socket.close();
};
}
else
{
// The browser doesn't support WebSocket
alert("WebSocket NOT supported by your Browser!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">Run WebSocket</a>
</div>
</body>
</html>
I :이 내 HTML 코드
public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel>
{
private static final String WEBSOCKET_PATH = "/websocket";
private final SslContext sslCtx;
public WebSocketServerInitializer(SslContext sslCtx) {
this.sslCtx = sslCtx;
}
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(sslCtx.newHandler(ch.alloc()));
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WebSocketServerCompressionHandler());
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
// pipeline.addLast(new WebSocketIndexPageHandler(WEBSOCKET_PATH));
pipeline.addLast(new WebSocketFrameHandler());
}
}
입니다 Chrome 브라우저를 사용하여 페이지를 탐색하고 웹 페이지의 링크를 클릭하면 다음 메시지가 표시됩니다. ': // localhost를 : WSS 4466/웹 소켓'에
웹 소켓 연결, 여기에 몇 가지 논의에 따르면 순 :: ERR_INSECURE_RESPONSE
및 그물코 웹 소켓의 샘플 코드 : 연결 설정에 오류 실패 wss는 HTTPS에 의해 전달되어야합니다. 내 웹 페이지에 다음과 같은 자바 스크립트 문을 변경할 때 :
ws = new WebSocket("wss://localhost:4466/websocket");
ws = new WebSocket("wss://echo.websocket.org");
에 그것은 잘 작동합니다. 그것은 혼란 스럽습니다. 왜 사이트 echo.websocket.org는 https 없이도 작동 할 수 있습니까? 왜 내 서버는 할 수 없습니까? 내 서버 소스 코드에 누락 된 것이 있습니까?
PS : 다음 URL에서 볼 수있는 echo.websocket.org 예 : 브라우저가 그것이 안전하지 감지하기 때문에, 당신의 웹 소켓 서버에 연결하는 데 실패
http://jsbin.com/muqamiqimu/edit?js,console
설명해 주셔서 감사합니다. –