Java服务端与C#客户端实现websocket通信(发送消息和文件)

Wesley13
• 阅读 777

设计思路

使用websocket通信,客户端采用C#开发界面,服务端使用Java开发,最终实现Java服务端向C#客户端发送消息和文件,C#客户端实现语音广播的功能。

Java服务端设计

package servlet.websocket;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import servlet.Log;

/**
 * websocket服务端
 * 
 * @author leibf
 *
 */
@ServerEndpoint(value = "/websocket/{clientId}")
public class WebSocketServer {
    private final Log log = new Log(WebSocketServer.class);
    private Session session;
    private String clientId;
    private static Map<String, WebSocketServer> clients = new ConcurrentHashMap<String, WebSocketServer>();

    // 连接时执行
    @OnOpen
    public void onOpen(@PathParam("clientId") String clientId, Session session) throws IOException {
        this.session = session;
        this.clientId = clientId;
        clients.put(clientId, this);
        log.info("新连接:" + clientId);
    }

    // 关闭时执行
    @OnClose
    public void onClose(@PathParam("clientId") String clientId, Session session) {
        clients.remove(clientId);

        log.info("连接 " + clientId + " 关闭");
    }

    // 收到消息时执行
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        log.info("收到用户的消息: "+  message);
        /*if("getMpDefsAndRtDatas".equals(message)){
            String msg = UnityServlet.getInstance().getAllMpDefsAndRtDatas();
            this.sendMessage(session, msg);
        }*/
    }

    // 连接错误时执行
    @OnError
    public void onError(@PathParam("clientId") String clientId, Throwable error, Session session) {
        log.info("用户id为:" + clientId + "的连接发送错误");
        error.printStackTrace();
    }

    /**
     * 发送消息给某个客户端
     * @param message
     * @param To
     * @throws IOException
     */
    public static void sendMessageTo(String message, String To) throws IOException {
        for (WebSocketServer item : clients.values()) {
            if (item.clientId.equals(To))
                item.session.getAsyncRemote().sendText(message);
        }
    }
    
    /**
     * 发送消息给某些客户端
     * @param message
     * @param To
     * @throws IOException
     */
    public static void sendMessageToSomeone(String message, String To) throws IOException {
        for (WebSocketServer item : clients.values()) {
            if (item.clientId.startsWith(To))
                item.session.getAsyncRemote().sendText(message);
        }
    }

    /**
     * 发送消息给所有客户端
     * @param message
     * @throws IOException
     */
    public static void sendMessageAll(String message) throws IOException {
        for (WebSocketServer item : clients.values()) {
            item.session.getAsyncRemote().sendText(message);
        }
    }
    
    /**
     * 发送消息
     * @param session
     * @param message
     * @throws IOException
     */
    private void sendMessage(Session session,String message) throws IOException{
        session.getBasicRemote().sendText(message);
    }
}

Java端发送请求指令

String clientId = "broadcast";
try {
    WebSocketServer.sendMessageTo("broadcast",clientId);
} catch (IOException e) {
    e.printStackTrace();
}

C#客户端设计

websocket连接

WebSocket websocket = null;
private void websocket_MessageReceived(object sender, MessageReceivedEventArgs e){
    //接收服务端发来的消息
    MessageReceivedEventArgs responseMsg = (MessageReceivedEventArgs)e; 
    string strMsg = responseMsg.Message;
    if(strMsg.Equals("broadcast")){
        websocketToPlay();
    }else if(strMsg.Equals("broadcastStop")){
        websocketToStop(sender,e);
    }
}
        
private void websocket_Closed(object sender, EventArgs e){
     DisplayStatusInfo("websocket connect failed!");
}

private void websocket_Opened(object sender, EventArgs e){
     DisplayStatusInfo("websocket connect success!");
}

//websocket连接
private void connectWebsocket(){
    websocket = new WebSocket("ws://localhost:8080/FrameServlet/websocket/broadcast");
    websocket.Opened += websocket_Opened;
    websocket.Closed += websocket_Closed;
    websocket.MessageReceived += websocket_MessageReceived;
    websocket.Open();
}

跨线程操作控件 --- InvokeRequired属性与Invoke方法

private delegate void DoLog(string msg);
private void DisplayStatusInfo(string msg)
{
    if (this.InvokeRequired)
    {
        DoLog doLog = new DoLog(DisplayStatusInfo);
        this.Invoke(doLog, new object[] { msg });
     }else{
        if (msg.Trim().Length > 0)
        {
             ListBoxStatus.Items.Insert(0, msg);
             if (ListBoxStatus.Items.Count > 100)
             {
                 ListBoxStatus.Items.RemoveAt(ListBoxStatus.Items.Count - 1);
             }
        }
     }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Easter79 Easter79
2年前
SpringBoot的Web开发之WebSocket(广播式)笔记总结
战斗前准备:新建SpringBoot项目选择Thymeleaf和WebSocket依赖广播式主要有7大步骤1.配置WebSocket2.编写浏览器向服务端发送消息(服务端用该类接收)3\.编写服务端向浏览器发送消息(服务端用该类发送)4\.编写一个Controller用于模拟发送和接收
Stella981 Stella981
2年前
SpringBoot的Web开发之WebSocket(广播式)笔记总结
战斗前准备:新建SpringBoot项目选择Thymeleaf和WebSocket依赖广播式主要有7大步骤1.配置WebSocket2.编写浏览器向服务端发送消息(服务端用该类接收)3\.编写服务端向浏览器发送消息(服务端用该类发送)4\.编写一个Controller用于模拟发送和接收
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
2年前
Java Socket基本例子——使用最原始方法
使用最原始的java.net.ServerSocket和java.net.Socket进行socket通信。实现的效果为:客户端向服务端发送消息、服务端向客户端发送消息、保留统计客户端的信息列表、剔除已经断开的客户端等。本文所有代码均可在https://gitee.com/songxinqiang/JavaSocketDemo(https://git
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这