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

辛辛苦苦写那么久的博客,最后手贱点了全屏富文本编辑器找上传附件的按钮,结果整个页面都卡死了,只能关掉再打开看自动保存的,尼玛的,就一个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. 选择排序的php实现 Selection Sort

    选择排序Selection Sort的PHP实现,安全按照算法所写. 同一排序算法下,需要趟数最多的数列是什么数列呢?思考中. 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序 ...

  2. LightOJ - 1104 概率

    题意:每年n天,求最少几个人使这些人中最少两个人生日相同的概率大于0.5 题解:直接递推,假设有k个人,所有情况为n^k,没有相同的情况为n*(n-1)*...*(n-k+1),可以算出1e5以内不超 ...

  3. LightOJ 1038 概率dp

    题意:给一个数n,每次除它的一个因子(等概率),问除到1的次数的期望是多少 题解:概率dp,对于一个数x,y是x的因子个数,因子是a1到ay,E(x)=(E(a1)+1)/y+...+(E(ay)+1 ...

  4. ipconfig | find /i "ipv4"

    C:\Users\Bob>ipconfig|find /i "IPv"   本地链接 IPv6 地址. . . . . . . . : fe80::d495:6e3:6368 ...

  5. Nodejs调试技术总结

    调试技术与开发技术构成了软件开发的基石.目前Nodejs作为新型的Web Server开发栈倍受开发者关注.总的来说Nodejs的应用程序主要有两部分:JavaScript编写的js模块和C语言编译的 ...

  6. Node.js 常用工具 (util.inherits)

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

  7. window上脚本到linux上不能用

    window上的脚本一定要用dos2unix 文件名处理一下

  8. LSTM与Highway-LSTM算法实现的研究概述

    LSTM与Highway-LSTM算法实现的研究概述 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2015-12-22 ...

  9. codeforces C. Pearls in a Row map的应用

    C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. Codeforces Round #242 (Div. 2)C(找规律,异或运算)

    一看就是找规律的题.只要熟悉异或的性质,可以秒杀. 为了防止忘记异或的规则,可以把异或理解为半加运算:其运算法则相当于不带进位的二进制加法. 一些性质如下: 交换律: 结合律: 恒等律: 归零律: 典 ...