WebSocket之java不使用容器

环境

java:1.7
websocket:1.3.0(Java-WebSocket-1.3.0.jar)

前言

因为想了解消息推送,而研究kafka,在研究时,自己感觉,要是我自己写一个类似的是不是更容易理解这些框架技术,想想单单实现消息推送这还是可行的,接着就想到了今天要讲的websocket

在网上搜索了很多教程,包括外文,都是基于容器的,比如:tomcatjetty等等。
因为我之前研究过密钥交换,所以我坚信,即使不使用容器也可以实现消息推送的。

服务器端代码

通过继承WebSocketServer,并且显示指定两个构造函数,其中一个参数是端口号:

package websocketJava.simple;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Set;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

public class ChatServer extends WebSocketServer{


    public ChatServer(int port) throws UnknownHostException{
        super(new InetSocketAddress(InetAddress.getLocalHost(), port));
    }


    public ChatServer(InetSocketAddress address) {
        super(address);
    }

    @Override
    public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
        sendToAll("new");

        System.out.println(webSocket + "entered the room!");
    }

    @Override
    public void onClose(WebSocket webSocket, int n, String str, boolean bool) {
        sendToAll(webSocket + "has left the room!");
        System.out.println( webSocket + " has left the room!" );
    }

    @Override
    public void onMessage(WebSocket webSocket, String message) {
        sendToAll(message);
        System.out.println("========="+message+"=========");
        System.out.println( webSocket + ": " + message );
    }

    @Override
    public void onError(WebSocket webSocket, Exception e) {
        e.printStackTrace();
    }


    public void sendToAll(String text){
        Set<WebSocket> con = (Set<WebSocket>) connections();
        synchronized (con) {
            for(WebSocket c : con){
                c.send(text);
            }
        }
    }
}

接着我们再写启动主方法:

package websocketJava.simple;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Smain {


    public static void main(String[] args) throws Exception {
        int port = 8887;

        ChatServer s = new ChatServer(port);

        s.start();

        System.out.println("ChatServer started on port " + s.getPort());



        BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));

//      s.run();
        while(true){
            String in = sysin.readLine();
            s.sendToAll(in);
        }
    }
}

前端代码

前端代码用的是HTML/js

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>消息推送</title>
</head>
<body>
 Welcome<br/>  
  <input id="text" type="text"/>  
  <button onclick="send()">发送消息</button>  
  <hr/>       
  <button onclick="closeWebSocket()">关闭WebSocket连接</button>  
  <hr/>  
  <div id="message"></div>  
  <script type="text/javascript">  
    var websocket = null;  
       //判断当前浏览器是否支持WebSocket  
       if ('WebSocket' in window) {  
           // websocket = new WebSocket("ws://192.168.152.85:8098");  
         // websocket = new WebSocket("ws://ggmes.push.sandbox.gofund.cn:8093");  
          websocket = new WebSocket("ws://192.168.152.85:8887");  
          websocket.extensions = "asdfds"; 
          console.log(websocket);
      }  
      else {  
          alert('当前浏览器 Not support websocket')  
      }  

      //连接发生错误的回调方法  
      websocket.onerror = function () {  
           setMessageInnerHTML("WebSocket连接发生错误");  
      };  

       //连接成功建立的回调方法  
       websocket.onopen = function () {  
           setMessageInnerHTML("WebSocket连接成功");  
       }  

      //接收到消息的回调方法  
       websocket.onmessage = function (event) {  
           setMessageInnerHTML(event.data);  
      }  

       //连接关闭的回调方法  
       websocket.onclose = function () {  
          setMessageInnerHTML("WebSocket连接关闭");  
       }  

       //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
       window.onbeforeunload = function () {  
           closeWebSocket();  
       }  

       //将消息显示在网页上  
       function setMessageInnerHTML(innerHTML) {  
          document.getElementById('message').innerHTML += innerHTML + '<br/>';  
      }  

      //关闭WebSocket连接  
       function closeWebSocket() {  
           websocket.close();  
       }  

       //发送消息  
       function send() {  
          var message = document.getElementById('text').value;  
          websocket.send(message);  
       }  
  </script>  
</body>
</html>

说明:

请求地址另一种写法:
var wsUri = getRootUri() + "/websocket/demo";
function getRootUri() {
return "ws://" + (document.location.hostname == "" ? "192.168.152.85" : document.location.hostname) + ":" +
(document.location.port == "" ? "8080" : document.location.port);
}

假设当前页面请求端口号就是websocket的端口号,就这可以使用这个方法

启动main方法后

测试结果如下:
控制台

这里写图片描述


前端

这里写图片描述

总结

我之后又尝试使用注解(Annotation)的方法来做,我没有成功;
因为写到一半时,发现:
①使用注解@ServerEndpoint,不知道怎么指定端口;
②假设就使用默认80端口,接下来我又不知道如何启动它。

主要是第二点:因为使用继承WebSocketServer类时,可以使用封装的start或者run方法来启动,这些都是现成的。而注解假设不使用容器(tomcatjetty)的话,实在是不知道怎么启动服务端(查了很久的资料)。

为什么我这么执迷不使用容器来启动呢?
我也不知道,总感觉最原始的,才是最好理解的!


参考地址:

https://github.com/TooTallNate/Java-WebSocket/wiki

websocket的helloworld

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要在Java使用WebSocket连接,你可以使用Java WebSocket API。以下是使用该API建立WebSocket连接的基本步骤: 1. 导入所需的类和接口: ``` import javax.websocket.ClientEndpoint; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.WebSocketContainer; import javax.websocket.EndpointConfig; import javax.websocket.CloseReason; import javax.websocket.OnClose; import javax.websocket.OnError; ``` 2. 创建一个WebSocket客户端类,并使用`@ClientEndpoint`注解进行标记: ``` @ClientEndpoint public class MyWebSocketClient { private Session session; @OnOpen public void onOpen(Session session) { this.session = session; System.out.println("WebSocket连接已打开"); } @OnMessage public void onMessage(String message) { System.out.println("收到消息:" + message); } @OnClose public void onClose(Session session, CloseReason closeReason) { System.out.println("WebSocket连接已关闭:" + closeReason); } @OnError public void onError(Session session, Throwable error) { System.out.println("WebSocket错误:" + error.getMessage()); } } ``` 3. 创建一个WebSocket容器,并使用容器来连接到WebSocket服务器: ``` public class WebSocketClientExample { public static void main(String[] args) { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); String uri = "ws://localhost:8080/my-websocket-endpoint"; // WebSocket服务器的URI try { Session session = container.connectToServer(MyWebSocketClient.class, URI.create(uri)); // 连接成功后,可以通过session对象发送消息或关闭连接 session.getBasicRemote().sendText("Hello, WebSocket Server!"); // ... session.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:上述示例中的`ws://localhost:8080/my-websocket-endpoint`是WebSocket服务器的URI,你需要将其替换为实际的服务器URI。此外,你还可以根据需要在`MyWebSocketClient`类中添加其他方法和逻辑来处理WebSocket事件。 这就是使用Java WebSocket API连接到WebSocket服务器的基本步骤。你可以根据具体需求进行扩展和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值