操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操

辛辛苦苦写那么久的博客,最后手贱点了全屏富文本编辑器找上传附件的按钮,结果整个页面都卡死了,只能关掉再打开看自动保存的,尼玛的,就一个div显示内容,都找不到按钮来还原,麻痹麻痹麻痹麻痹麻痹,这恶心的IE,没心情写了,后面的是手动F12从dom中拷出来的代码,最后直接发个百度网盘的连接吧,这个富文本编辑器都没看到上传附件的按钮

接下来看下线程里的操作:

/// <summary>
/// 异步线程发送信息
/// </summary>
public class ThreadSendMsg
{
public void DoWork()
{
while (true)
{
try
{
List<MsgEntity> list = GlobalWeChatMsgList.GetList();
for (int i = 0; i < list.Count; i++)
{
var session = list[i].session;
if (session != null)
{
var session_client = session.AppServer.GetAllSessions();
var client = session_client.Where(c => c.SN == list[i].sn);
if (client != null)
{
foreach (var item in client)
{
item.Send(list[i].msg + " " + list[i].guid.ToString() + " " + list[i].open_id + "$");
}
}
}
} }
catch (Exception ex)
{
LogHelper.WriteLog("线程循环出错:" + ex.Message + "------------" + DateTime.Now.ToString());
} //线程睡眠1秒
System.Threading.Thread.Sleep(2000);
}
}
}

上面有一句:if (client != null)  ,这里从所有的session查找sn=列表中的那个,并判断这个连接是否还在线,如果在则发送,不在则消息还存在待发送的列表中 上面我们向安卓客户端发出去了消息,什么时候我们来把这条消息从待发送列表中删掉呢?不然安卓客户端就会不停的收到这条消息,这就需要安卓客户端主动告诉我们已经收到了这条消息我们新加一个命令:

/// <summary>
/// 客户端来这里确认收到消息
/// </summary>
public class IGET : CommandBase<WeChatSession, StringRequestInfo>
{
public override void ExecuteCommand(WeChatSession session, StringRequestInfo requestInfo)
{
if (requestInfo.Parameters.Count() != 1)
{
session.Send("error parameters\r\n");
return;
} string key = requestInfo.Parameters[0];
if (string.IsNullOrWhiteSpace(key))
{
session.Send("guid is null\r\n");
return;
} if (key.Substring(key.Length - 1, 1) != "$")
{
session.Send("error guid\r\n");
return;
} try
{
Guid guid = new Guid(key.Substring(0, key.Length - 1));
GlobalWeChatMsgList.RemoveMsg(guid);
session.Send("success\r\n");
}
catch
{
session.Send("not validate guid\r\n");
} }
}

基本功能这里都已经好了,还有一个是客户端连接的心跳,客户端怎么知道当前与socket服务器连接正常?所以再加一个命令处理类:

 public class XT : CommandBase<WeChatSession, StringRequestInfo>
{
public override void ExecuteCommand(WeChatSession session, StringRequestInfo requestInfo)
{
if (requestInfo.Parameters.Count() == 1)
{
if (requestInfo.Parameters[0] == "&")
{
if (!session.isLogin|| string.IsNullOrWhiteSpace(session.SN))
session.Send("no check\r\n");
else
session.Send("$\r\n");
}
}
}
}

这个心跳的消息通讯很简单,他发一个&字符,服务器响应一个$符号,这里再重申一下,服务器与客户端的通讯信息结尾都是以\r\n结束。

---------------------------------------------------------------------------------- End ---------------------------------------------------------------------------------------------------------

源码:http://pan.baidu.com/s/1bntsF3x

又看了一下仅剩的博客,妈蛋的,丢了一大半,这篇已经没法看了,直接下源码看吧,操操操操操操操操操操操操操


                                  2016-06-06更新

  今天闲来无事,又看了一下SuperSocket,本来想把这篇残缺的博客补一补,但是官方文档已经写的那么详细了,我觉得就没必要再赘述了,就这样吧

我的第一个Socket程序-SuperSocket使用入门(二)的更多相关文章

  1. 我的第一个Socket程序-SuperSocket使用入门(一)

    第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...

  2. 我的第一个Socket程序-SuperSocket使用入门(三)

    本来博客都停了,不打算更了,但今天百度一个socket的问题时无意间发现第一篇的socket文章权重仅次于SuperSocket网站,顿时觉得自己6到不行,再写一篇,讨论下数据持久化的问题 去年搞那个 ...

  3. (一)你的第一个Socket程序

    概述 本文通过一个最简单的Socket通信来对每一步做通俗易懂的讲解让你了解这些函数到底是干什么用的.下面的代码虽然是用Pyhton实现的,但是你要知道这些通信机制并不是Python所定义的,因为这些 ...

  4. Hello Socket - 第一个Socket程序

    1. 首先,要编写windows下socket程序,必须要加入Winsock支持 2. 服务端监听程序(Server.cpp) #include<winsock2.h> //包含头文件 # ...

  5. 今天在网上查看了一个socket程序,运行的时候一直报错,经过队友解决?

    1.首先是问题代码ip_port = ('192.168.12.2',8001)2.上边的代码本身没有问题,但是必须经过修改自己本机的局域网IP地址才能顺利链接请参考上一篇blog的地址,查看本机的i ...

  6. Glue4Net简单部署基于win服务的Socket程序

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...

  7. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

  8. 第一个socket服务端程序

    第一个socket服务端程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...

  9. SuperSocket快速入门(二):启动程序以及相关的配置

    如何快速启动第一个程序 既然是快速入门,所以,对于太深奥的知识点将不做讲解,会在后续的高级应用章节中,会对SS进行拆解.所有的实例90%都是来自SS的实例,外加本人的注释进行讲解. 一般应用而言,你只 ...

随机推荐

  1. poi读取Excel内容数据

    public static void main(String[] args) { try{ //获取文件输入流 FileInputStream fileIn = new FileInputStream ...

  2. Web API 接口-JavaScript全部api接口文档

    当使用JavaScript编写网页代码时,有很多API可以使用.以下是所有对象.类型等接口的列表,你在开发网页应用程序或站点时使用它们. API文档地址:https://developer.mozil ...

  3. 自己动手写一个U盘拷贝小工具

    这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...

  4. c、rust、golang、swift性能比较

    mac 计算速度视觉判断是(由好到差):c > rust > swift > golang 内存开销在mac上是(由好到差):c > rust > golang > ...

  5. PHP文件管理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. ICE的连接机制

    1.当使用ICE的proxy进行方法调用时,ICE运行环境会建立一个到服务器的连接.当proxy提供了多个endpoint时   默认的ICE运行环境选择endpoint的行为为random,可以通过 ...

  7. 图片上传-本地图片转base64+ie8支持+本地预览支持

    最近项目由于flash同学没在了,图片上传只能前端重新做,后台希望用base64数据上传,复用之前接口 问题来了, 1.ie8 不支持canvas转base64 2.本地预览 base64数据,ie8 ...

  8. map的内存分配机制分析

    该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代 ...

  9. 小组项目需求——NABCD

    关于项目微食堂的NABCD: N(need): 就我自己而言,每天在上午三四节课时就会想中午吃什么.而且大部分的课在二教,离食堂较远.可能会面临“抢不到饭”的问题.首先不知道去哪吃.吃什么,尤其在时间 ...

  10. hw_module_t 加载过程

    每一个HAL模块都有一个ID值,以这些ID值为参数来调用硬件抽象层提供的函数hw_get_module就可以将指定的模块加载到内存来,并且获得 一个hw_module_t接口来打开相应的设备. 函数h ...