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#客户端界面展示
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!