我的第一个Socket程序-SuperSocket使用入门(二)
操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操操
辛辛苦苦写那么久的博客,最后手贱点了全屏富文本编辑器找上传附件的按钮,结果整个页面都卡死了,只能关掉再打开看自动保存的,尼玛的,就一个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使用入门(二)的更多相关文章
- 我的第一个Socket程序-SuperSocket使用入门(一)
第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...
- 我的第一个Socket程序-SuperSocket使用入门(三)
本来博客都停了,不打算更了,但今天百度一个socket的问题时无意间发现第一篇的socket文章权重仅次于SuperSocket网站,顿时觉得自己6到不行,再写一篇,讨论下数据持久化的问题 去年搞那个 ...
- (一)你的第一个Socket程序
概述 本文通过一个最简单的Socket通信来对每一步做通俗易懂的讲解让你了解这些函数到底是干什么用的.下面的代码虽然是用Pyhton实现的,但是你要知道这些通信机制并不是Python所定义的,因为这些 ...
- Hello Socket - 第一个Socket程序
1. 首先,要编写windows下socket程序,必须要加入Winsock支持 2. 服务端监听程序(Server.cpp) #include<winsock2.h> //包含头文件 # ...
- 今天在网上查看了一个socket程序,运行的时候一直报错,经过队友解决?
1.首先是问题代码ip_port = ('192.168.12.2',8001)2.上边的代码本身没有问题,但是必须经过修改自己本机的局域网IP地址才能顺利链接请参考上一篇blog的地址,查看本机的i ...
- Glue4Net简单部署基于win服务的Socket程序
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
- 第一个socket服务端程序
第一个socket服务端程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- SuperSocket快速入门(二):启动程序以及相关的配置
如何快速启动第一个程序 既然是快速入门,所以,对于太深奥的知识点将不做讲解,会在后续的高级应用章节中,会对SS进行拆解.所有的实例90%都是来自SS的实例,外加本人的注释进行讲解. 一般应用而言,你只 ...
随机推荐
- ControlTemplate,ItemsPanelTemplate,DataTemplate(wpf)
在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板, ...
- nvm工具
nvm工具 nvm简介 nvm是node version manager的简称,是nodeJs的版本管理器,他可以在一台主机上对node的版本进行方便的切换.我尝试了一下window的,但是不行,你可 ...
- 五一清北学堂培训之Day 3之DP
今天又是长者给我们讲小学题目的一天 长者的讲台上又是布满了冰红茶的一天 ---------------------------------------------------------------- ...
- 持续集成平台jenkins
一. 什么是持续集成 1. 概念 持续集成(Continuous Integration),也就是我们经常说的CI 持续集成(CI)是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发 ...
- Hive mapreduce SQL实现原理——SQL最终分解为MR任务,而group by在MR里和单词统计MR没有区别了
转自:http://blog.csdn.net/sn_zzy/article/details/43446027 SQL转化为MapReduce的过程 了解了MapReduce实现SQL基本操作之后,我 ...
- dilworth定理的通俗讲解
度娘定义:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度.其名称取自数学家Robert P. Dilworth. 反链是一种偏序集,其任意两 ...
- uva11134 - Fabled Rooks(问题分解,贪心法)
这道题非常好,不仅用到了把复杂问题分解为若干个熟悉的简单问题的方法,更是考察了对贪心法的理解和运用是否到位. 首先,如果直接在二维的棋盘上考虑怎么放不好弄,那么注意到x和y无关(因为两个车完全可以在同 ...
- OpenCV - Android Studio 2.2 中利用CAMKE进行OpenCV的NDK开发
我在http://www.cnblogs.com/fx-blog/p/8206737.html一文中提到了如何在Android Studio中Java层导入OpenCV(包含opencv_contri ...
- Shiro-RememberMe
概述 认证和记住我 建议 身份验证相关 实现 如果要自己做RememeberMe,需要在登录之前创建Token:UsernamePasswordToken(用户名,密码,是否记住我),且调用 User ...
- LeetCode Binary Tree Tilt
原题链接在这里:https://leetcode.com/problems/binary-tree-tilt/description/ 题目: Given a binary tree, return ...