菜鸡入门websocket,一天了都没摸到门道,要解决的问题是这样的,一个页面有个按钮,点击后给客户端传送一个开始的消息,客户端运行完成后会传送消息给服务器端,服务器端进行接收,有木有老哥指导一下呀
请参考
https://blog.csdn.net/qq_34309305/article/details/76892297
https://img.mukewang.com/down/5a6e804c0001970d00000000.zip
直接下载
https://www.imooc.com/learn/941
也可以看这个视频深度学习一下,慕课网上免费的。netty-socket进阶教程
使用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,就可以了