设计思路

使用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. android客户端向java服务端post发送json

    android 端: private void HttpPostData() {        try { HttpClient httpclient = new DefaultHttpClient( ...

  2. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...

  3. RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

    本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实现Client和Server C#服务端,Java客户端 其中 ...

  4. java服务端集成极光消息推送--详细开发步骤

    1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...

  5. Unity3D客户端和Java服务端使用Protobuf

    转自:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖 ...

  6. 3、netty第二个例子,使用netty建立客户端,与服务端通讯

    第一个例子中,建立了http的服务器端,可以直接使用curl命令,或者浏览器直接访问. 在第二个例子中,建立一个netty的客户端来主动发送请求,模拟浏览器发送请求. 这里先启动服务端,再启动客户端, ...

  7. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

  8. C++客户端访问Java服务端发布的SOAP模式的WebService接口

    gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以 简单快速地开发出SOAP/XML的服务器端和客户端 Step1 使用gsoap-2.8\gsoap\bin\win32\wsdl ...

  9. Akka(43): Http:SSE-Server Sent Event - 服务端主推消息

    因为我了解Akka-http的主要目的不是为了有关Web-Server的编程,而是想实现一套系统集成的api,所以也需要考虑由服务端主动向客户端发送指令的应用场景.比如一个零售店管理平台的服务端在完成 ...

随机推荐

  1. 01-scrapy框架

    1.Scrapy图例: Scrapy Engine(引擎): 负责Spider.ItemPipeline.Downloader.Scheduler中间的通讯,信号.数据传递等. Scheduler(调 ...

  2. WebStorm 在 Mac 版本的基本设置,包括 ES6、Node.js、字体大小等

    WebStorm 在 Mac 和 win 的设置有区别,便于以后用到快速查找,记之. 要设置先点击 WebStorm 字样如下图: 后点击 Preferences 字样如下图: 设置 es6 语法, ...

  3. springboot(一).初识springboot以及基本项目搭建

    初识springboot 以及基本项目搭建 由于新的项目需要搭建后台框架,之前的springmvc架构也使用多次,在我印象中springboot的微服务架构更轻量级更容易搭建,所以想去试试spring ...

  4. Selenium-webdriver+八种元素定位

    进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素 ...

  5. http三次握手,四次挥手

    本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后 ...

  6. 15 可视化工具 Navicat的简单使用

    本节重点: 掌握Navicat的基本使用 # PS:在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作My ...

  7. 《Effective Java》读书笔记 - 2.创建和销毁对象

    Chapter 2 Creating and Destroying Objects item 1:Consider static factory methods instead of construc ...

  8. 2018年5月6日GDCPC(广东赛区)总结

    大二第二次参加省赛了,这次成绩不是太理想. ———————————————————————————————— day1:试机 约好的12点钟在地铁站集合,好像就我一个人迟到了5分钟,被sen主席批判一 ...

  9. legend3---Homestead中Laravel项目502 Bad Gateway

    legend3---Homestead中Laravel项目502 Bad Gateway 一.总结 一句话总结: 用查看错误日志的方法解决错误:(/var/log/nginx/.log) 1.home ...

  10. 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制

    这个是可以的,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致. 每个编译单元只能有一个public 类.这么做的意思是,每个编译单元只能有一个公开 ...