2013年4月16日

面试总结

昨天我去华北计算技术研究所参加笔试和面试。出发前在网上看了一下这个单位的评价——不太好——因2012年的招聘爆出诸多问题而被称为坑爹“坑爹十五所”。到了之后,人力资源的先拿了一套笔试题让我们做。说实话,笔试很随意,就随便让我们找了两个空的工位,让我们做。

2013年4月4日

ASP.NET 网站维护实例

我3月21日回到学校,就被告知,某个部门的网站坏了。最初是一个Excel导出功能无法正常工作,导出的文件并不是先前期望的那样。由于这并不是本文重点,我就一笔带过——问题在于Excel的DCOM配置,添加了NETSERVICE账户并赋予相应权限后,得以解决。随之而来的问题是:导出的文件没法从服务器上删除。我们又添加了log4net,输出了一些调试信息,发现是最后导出文件结束、关闭Excel进程时出的问题。网站以NETSERVICE这个账户运行,但Excel是以Administrator运行的,在执行Process.Kill()方法时会抛出异常。虽然作者在里面使用了try-catch块来处理异常,但似乎这个异常仍然没被catch到,抛上来,后面删除文件的代码也就没有执行。

即日起停止更新SuperSocket的研究系列文章

最初写这些文章是为了记录在学习SuperSocket 1.5官方文档时遇到的各种问题,多是官方文档中没有阐述清楚的地方,顺带将英文文档翻译成中文。目前已经有人将全部文档翻译完成,我也就不再更新了。如果还有使用上需要注意的问题,我还会再发文。

这里给出SurperSocket 1.5 中文文档(非项目作者翻译)

SuperSocket的作者也开始提供最新的中文文档,见SuperSocket 1.6 中文文档: SuperSocket

2013年3月18日

SuperSocket的研究(10)—— 扩展服务器配置文件

当你用SuperSocket实现自己的socket服务器时,不可避免地要在配置文件中定义一些参数。SuperSocket提供一种简单的方式来存储你配置文件中的参数,然后在AppServer中读取并使用它们。

2013年3月17日

SuperSocket的研究(9)—— 向客户主动端推送数据

使用Session对象向客户端发送数据

我们已经提到过,AppSession表示一个逻辑socket连接,基于连接的各种操作应该被定义在这个类中。AppSession也封装了一些发送数据的方法。你可以是使用AppSession的Send(...)方法来向客户端发送数据。
session.Send(data, 0, data.Length);
//或者
session.Send("Welcome to use SuperSocket!");

2013年3月16日

SuperSocket的研究(8)—— 获取连接的建立和关闭事件

AppSession中的OnSessionStarted()和OnSessionClosed(CloseReason reason)虚方法

你可以覆盖父类中的虚方法,OnSessionStarted()和OnSessionClosed(CloseReason reason)来处理新会话的连接或会话的销毁时的业务操作:
public class TelnetSession : AppSession<TelnetSession>
{
    protected override void OnSessionStarted()
    {
        this.Send("Welcome to SuperSocket Telnet Server");
        //添加你的业务操作
    }

    protected override void OnSessionClosed(CloseReason reason)
    {
        //添加你的业务操作
    }
}

AppServer中的NewSessionConnected和SessionClosed事件

绑定事件:
appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);
appServer.SessionClosed += new SessionHandler<AppSession, CloseReason>(appServer_SessionClosed);
定义事件处理方法
static void appServer_SessionClosed(AppSession session, CloseReason reason)
{
    Console.WriteLine("A session is closed for {0}.", reason);
}

static void appServer_NewSessionConnected(AppSession session)
{
    session.Send("Welcome to SuperSocket Telnet Server");
}

SuperSocket的研究(7)—— 内置的通用格式协议实现工具

在阅读过前面的文档后,你可能会发现用SuperSocket来实现你自己的协议可能并不那么容易。SuperSocket提供一些通用协议工具来简化这项工作,它能让你更快、更轻松地构建自己的协议。

WAVE文件结构与《女仆咖啡帕露菲Re-Order》BGM提取

前几天在PSP上把《帕露菲》所有线都通了,以前玩过的《青空下的约定》也是GIGA做的。不得不说这个公司做GalGame是相当的厚道:可以无限制回溯上一选择肢,每个选择肢上都标注的有该事件的主要人物,一直选某一个角色的事件,就能走到该角色的结局。这个方法在攻略《青空》时百试不爽,不过《帕露菲》就不太行得通了。不过《帕露菲》也提供了更详细的选择肢提示:每个事件不仅有主要参与任务头像,还有该事件对结局的影响,例如:由飞TRUE NORMAL END;明日香日常事件。GIGA并不打算把玩家引入选择肢的迷宫在里面鬼打墙,而是让玩家把精力集中到品味剧本、音乐上来。从这个角度来看,GIGA算得上是业界良心,比那《恋爱蜡笔》不知高到哪里去了。

2013年3月14日

SuperSocket的研究(6) —— 用IRequestInfo,IReceiveFilter等实现自己的通信协议

为什么使用自己的通信协议?

通信协议用来将接收到的二进制数据转换成你的应用能够理解的请求。SuperSocket提供了一个内置的通信协议“命令行协议”,它规定每个请求必须以回车换行符“\r\n”结束。
但是一些应用可能因为各种不同的原因而无法使用“命令行协议”。针对这种情况,你需要用如下的工具来实现自己的通信协议:
  • RequestInfo
  • ReceiveFilter
  • ReceiveFilterFactory
  • AppServer
  • AppSession

2013年3月13日

SuperSocket的研究(5)—— 内置的命令行协议

什么是协议

什么是协议?很多人也许会回答“TCP”或“UDP”。但构建一个网络应用仅靠TCP或者UDP是不够的。TCP和UDP都是传输层协议。如果你仅仅定义了传输层协议,是远不能满足让两个终端用户在网络上通信的。你需要定义你的应用层的协议以转换你接收到的二进制数据,使之成为你的应用能理解的请求。