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

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

设计思路

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

也可以看看 GoEasy文库 的其他资料.

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据