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


    设计思路

    使用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#客户端界面展示

  • 相关阅读:
    在插入一条记录后 取得自动增长ID
    hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些
    单例模式
    聚簇索引与非聚簇索引的区别
    基于SQL SERVER2008的SCCM2007部署
    XML架构下的表结构设置主键
    IE6与IE7下一点样式的区别
    Session丢失原因与解决方案小结
    Python_如何去除字符串里的空格
    Python_让人脑阔疼的编码问题(转)+(整理)
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/11136555.html
Copyright © 2020-2023  润新知