关于websocket编程的问题 20C

菜鸡入门websocket,一天了都没摸到门道,要解决的问题是这样的,一个页面有个按钮,点击后给客户端传送一个开始的消息,客户端运行完成后会传送消息给服务器端,服务器端进行接收,有木有老哥指导一下呀

6个回答

使用spring-websocket,和h5的websocket.
1.h5的socket中使用制定的api,引入js--->
var ws;
function initWebSocket(){
ws = new WebSocket("ws://localhost/websocket/ws");

  ws.onopen = function(){
    var TheAlreadySendMessage= $('.text').text();
    $('.text').text(TheAlreadySendMessage + "连接已建立!");
  };

  ws.onmessage = function (evt){ 
     var received_msg = evt.data;
     var TheAlreadySendMessage= $('.text').text();
     $('.text').text(TheAlreadySendMessage + received_msg);
  };

  ws.onclose = function(event) {
      console.log("Web Socket closed." + new Date().getTime());
  };

  ws.onerror = function(event) {
      console.log("Web Socket error.");
  }; 

}

2.spring-websocket
@Component("webSocketConfig")
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer{
@Autowired
private ChatWebSocketHandler webSocketHandler;

@Autowired
private CharHandshakeInterceptor charHandshakeInterceptor;


@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    registry.addHandler(webSocketHandler, "/ws").addInterceptors(charHandshakeInterceptor);
    registry.addHandler(webSocketHandler, "/ws/socketjs").addInterceptors(charHandshakeInterceptor);
}

}

@Component("chatWebSocketHandler")
public class ChatWebSocketHandler implements WebSocketHandler{

private static Map<User,WebSocketSession> ONLINE_CHAT_USER = new ConcurrentHashMap<User,WebSocketSession>();

private static Map<Service,WebSocketSession> ONLINE_CHAT_SERVICE = new ConcurrentHashMap<Service,WebSocketSession>();

private volatile static  int ONLIE_USER_COUNT = 0;

private volatile static  int ONLIE_SERVICE_COUNT = 0;

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    User user = (User) session.getAttributes().get("user");
    ONLINE_CHAT_USER.put(user, session);
    ++ONLIE_USER_COUNT;
    Message msg = new Message();
    msg.setText("��������������ӳɹ�!");
    msg.setDate(new Date());
    Gson gson = new Gson();
    TextMessage message = new TextMessage(gson.toJson(msg));
    sendMessageToUser(session,message);
}

@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
    if(message.getPayloadLength() == 0) {
        return;
    }
    System.out.println("��õ�message��------>"+message.getPayload().toString().trim());
    Message msg = new Message();
    msg.setDate(new Date());
    String text = "��������������Ϣ~~~~~~~~~~~~~~~~~~~~~~";
    String htmlEscapeText = HtmlUtils.htmlEscape(text);
    msg.setText(htmlEscapeText);
    this.sendMessageToUser(session,new TextMessage(new Gson().toJson(msg)));
}

@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    System.out.println("WebSocket�쳣�Ͽ�:"+session.getId()+"�Ѿ��ر�");
    Message msg = new Message();
    msg.setDate(new Date());
    TextMessage message = new TextMessage(new Gson().toJson(msg));
    this.sendMessageToUser(session,message);
    if(session.isOpen()){
        session.close();
    }
    User loginUser = (User) session.getAttributes().get("loginUser");

}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    System.out.println(System.currentTimeMillis());
    System.out.println("WebSocket�رնϿ�:"+session.getId()+"�Ѿ��ر�");
    Message msg = new Message();
    msg.setDate(new Date());
    msg.setText("���ӶϿ�!");
    TextMessage message = new TextMessage(new Gson().toJson(msg));
    this.sendMessageToUser(session,message);    
    if(session.isOpen()){
        session.close();
    }
    User loginUser = (User) session.getAttributes().get("loginUser");
}

@Override
public boolean supportsPartialMessages() {
    return false;
}

public void sendMessageToUser(WebSocketSession session, TextMessage message) throws IOException {
    session.sendMessage(message);
}

}

@Component("charHandshakeInterceptor")
public class CharHandshakeInterceptor implements HandshakeInterceptor{

@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
        Map<String, Object> attributes) throws Exception {
    return true;
}

@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
        Exception exception) {
}

}

这都是核心的,我也在弄这个,刚弄到这一步

你这个问题太宽泛了,建议还是问具体的问题比较好,有利于你的成长。

关于你这个问题,提供思路如下:
“一个页面有个按钮,点击后给客户端传送一个开始的消息,客户端运行完成后会传送消息给服务器端,服务器端进行接收”
你这句话涉及三方:
1、独立页面(特殊的那个客户端),用于启动整个流程,这里要做的就是,连接websocket服务器,点击按钮的操作,是发送消息给服务端ws.send(“hello”);
2、服务端:接收到开始命令后,转发给所有的客户端(那个特殊的客户端监听到这个消息可以不做处理)
3、其他客户端:监听到消息后ws.onmessage = function(evt) { "处理要做的事,做完之后,调用send方法给" };

代码上可以参考下这个:https://www.cnblogs.com/magicsoar/p/3615080.html

另外如果需要像在线聊天程序一样,区分下客户端,也可以在连接请求上加参数,比如用户id,就可以了

ejiao1233
alunSemiconductor 我给你找了个例子,你可以试试看,先把他的程序运行起来看看https://www.cnblogs.com/interdrp/p/7903736.html
一年多之前 回复
ejiao1233
alunSemiconductor 你在网上搜的代码的形式可能不一样,但是都离不开一个最基本的思路,建立连接,监听消息,发送消息。
一年多之前 回复
baidu_40582876
学习中的青年 。我不知道如何接收和发送消息,具体怎么去实现这个接收和发送
一年多之前 回复
baidu_40582876
学习中的青年 因为是第一次接触,所以问得东西比较宏观,但是微观的技术确实不会用,困扰了一天了,还是无从下手,我觉得老哥说的很有道理,这里我按我的理解具体一下,希望老兄能多多帮助下
一年多之前 回复

https://www.imooc.com/learn/941
也可以看这个视频深度学习一下,慕课网上免费的。netty-socket进阶教程

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问