Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)

摘要:
设计思想使用websocket通信,客户端使用C#开发接口,服务器使用Java开发。最后,Java服务器向C#客户端发送消息和文件,C#客户端实现语音广播功能。

设计思路

使用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);
             }
        }
     }
}

C#客户端界面展示

Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)第1张

免责声明:文章转载自《Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在pycharm中运行python程序dubbo下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

针对负载均衡集群中的session解决方案的总结

在日常运维工作中,当给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP、Python、Ruby还是Java语言环境,只要使用服务器保存Session,在做负载均衡时都需要考虑Session的问题。 通常面临的问题 1 2 3 4 5 6 7 8 从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端...

C++学习笔记九顺序容器(二) ForFreeDom 博客园

C++学习笔记九-顺序容器(二) - ForFreeDom - 博客园 一、插入操作如何影响容器的选择: 1.list 容器表示不连续的内存区域,允许向前和向后逐个遍历元素。在任何位置都可高效地 insert 或 erase 一个元素。插入或删除 list 容器中的一个元素不需要移动任何其他元素。另一方面,list 容器不支持随机访问,访问某个元素要求...

这样配置你的IDEA工作效率提高好几倍!

链接 | blog.csdn.net/fly910905/article/details/77868300 1.设置maven 1.在File->settings->搜索maven2.Mavan home directory--设置maven安装包的bin文件夹所在的位置3.User settings file--设置setting文件所在的...

VS2010项目的部署与安装

winform程序,我想进行安装。 1、在解决方案中 ——点击右键——添加 2、然后选择 安装和部署 ——安装向导 可以更改名称 3、点击 下一步 4、然后选择上那3个 5、点击完成之后 会出现如下界面 6、点击应用程序文件夹 选择主输出 ——右键 创建快捷方式 7、创建完快捷方式后——右键 剪切 在选择 用户桌面 —— 右键粘贴 这里就是程...

C#穿透session隔离———Windows服务启动UI交互程序 be

在Windows服务里面启动其他具有界面的应用程序,需要穿透session隔离,尝试了很多种方法,都可行,现在一一列举下来,并写下几个需要注意的地方。 需要注意的地方 首先要将服务的Account属性设置为LocalSystem,安装服务后的登录身份则为本地系统账户         再一个需要注意的是不要把Windows服务的程序放在C:\Users\Ad...

OpenSSL 介绍和使用

转自:https://www.jianshu.com/p/fb2ae3dc7986 一、SSL 简介 按照我的理解来解释下,为了让网络通信更安全,需要认证和加密,认证是说明你是要找的人,加密是为了让截获中间报文第三者无法得到消息内容。 为此有人设计了SSL,即套接字上的安全层,简单来说就是在TCP之上做一个安全通信层,HTTP on SSL 即是HTT...