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

本文介绍了如何使用Java实现WebSocket服务端,与C#客户端进行实时通信。Java服务端通过@ServerEndpoint注解配置WebSocket,并提供打开、关闭、消息处理等方法。C#客户端建立连接,监听消息并进行相应操作。通过这种方式,Java能够向C#发送消息和文件,C#可以实现语音广播功能。
摘要由CSDN通过智能技术生成

设计思路

使用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 clients = new ConcurrentHashMap();

// 连接时执行

@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);

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值