海贼精神  
骂别人不革命,便是革命者,则自己不做事,而骂别人的事做得不好,自然便是更做事者。 若与此辈理论,可以被牵连到白费唇舌,一事无成,也就是白活一世,于己于人,都无益处。 我现在得了妙法,是谣言不辩,诬蔑不洗,只管自己做事。 ——鲁迅1934年6月21日信




内容记:

MSN Robot就是MSN机器人, 也可以喊成MSN聊天机器人.再解释就是会自动和你聊天的MSN,再再解释就是……, 我短路了(耳朵冒烟中)

本随笔是MSN Robot随笔系列第四篇, 内容是关于MSN Robot信息的最后结合.

 

 




前记:

神的右眼已经依稀可以看见梦想的征途…

 

 

 

昨天我们伟大的实现了一个message的实体类来处理信息的接收, 信息发送, 对话加入, 对话解除, 还有一点点的心跳, 就是session_close. ( 当然,这点心跳是远远不够的,看着我的眼睛,相信我,o,希望你是个女生 >__< ~~~ )

 

关于心跳讨论的结点比较多, 因为服务器总是有很奇怪的举动, 不把咱们T下线它总是良心不安的, 所以明天咱们单独讨论它就好了 J 今天咱们继续来组合变形金刚吧~~

 

应该让它动起来了.

 

什么是一个机器人呢? 它应该在收到用户发来的消息之后解析掉这个消息, 然后把答案回发给用户哟~~

 

, 真是个冠冕堂皇标准的回答. 不用理它, 咱们还是来看看代码怎么实现吧 J

 

// 当用户消息发过来的时候, 会触发ConversationCreated事件, 所以咱们要处理这个事件.

messenger.ConversationCreated += new

ConversationCreatedEventHandler(messenger_ConversationCreated);

 

// 因为当用户发来消息的时候第一时间会来到这里

private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)

{

// check if the request is initiated remote or by this object

// if it is initiated remote then we have to create a conversation form. Otherwise the

// form is already created and we don't need to create another one.

if (e.Initiator == null)

{

// use the invoke method to create the form in the main thread

this.Invoke(new CreateMessageDelegate(CreateMessage), new object[] { e.Conversation });

}

}

//创建一个线程运行Message实例

private void CreateMessage(Conversation conversation)

{

 

  // 咱们在这里需要打开一个线程处理message, 因为语意分析和问题解决一定是堵塞型的

  // 所以咱们要考虑多用户同时请求时候的处理

Thread depthMessage = new Thread(delegate()

{

  // 开始执行一个Message实例

Message mess = new Message(conversation, this);

});

 

depthMessage.Name = "Message";

depthMessage.Start();

}

 

这时候咱们和服务器的通讯是这样的:

 

>>> 为客户端套接字发送

<<< 为客户端套接字接收

 

 

<<< RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh

// 服务器说: 有一个哥们想跟你聊天诶

 

>>> ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066

// 咱们说: 行呀, 美女?! 大姐姐你爱吃青椒吗? &^^$%##$!@#!#!@

 

<<< IRO 1 1 1 deaxxxx@hotmail.com Venkatesh ANS 1 OK
//
服务器说, 月老牵线结束, 你们俩就可劲聊吧. Make love我都不管你.

 

OK, 醒醒, YY, 这时候咱们发现在第一步的时候触发了咱们温柔可爱贤惠善良的ConversationCreated事件, 而后咱们多线程创建了一个message处理这个对话.

 

第二步暂时笔者尚未找到拒绝方法… -_-#... 难道男人来了咱们也得接受吗? #$@#%$#!#!^&^*^&

 

但是在什么时候才触发第三步的接收呢? Bingo~ 答案自然是昨天帮助咱们解决掉null hellmessage类中的Switchboard_ContactJoined事件.

 

 

OK! 简洁的今天让咱们再来看看发送消息的对接吧 J

 

 

// 发送消息按钮单击事件

private void inviteButton_Click(object sender, System.EventArgs e)

{

string tempSender = richTextBox2.Text;

 

// MSN消息有最高发送字数限制 J 要注意哟, 太长了会引起error返回导致咱们的程序异常

if (tempSender.Length > 800)

{

MessageBox.Show("发送长度不能超过");

return;

}

 

if (message == null)

{

return;

}

 

// 开启一个线程处理message

Thread depthMessage = new Thread(delegate()

{

if (ContactListView.SelectedItems.Count == 0)

return;

 

if (message.Conversation.Switchboard.Contacts.Count == 0)

{

    

// 获得Contact

Contact selectedContact = (Contact)ContactListView.SelectedItems[0].Tag;

 

// 创建对话

Conversation Cconversation = messenger.CreateConversation();

 

// 咱们需要先邀请好友加入咱们的会话, 然后在Message类中的join事件才能获得IRO的返回成功建立对话 J

Cconversation.Invite(selectedContact);

 

message = new Message(Cconversation, this);

}

 

message.SendInput(tempSender);

 

});

 

depthMessage.Name = "go";

depthMessage.Start();

 

}

 

, 咱们需要了解一下Contact类就是咱们好友的资料合集, 可以点开看看这个类的包含 J 很简单, 一般咱们在读取好友资料的时候把它绑定在好友项的tag.

 

咱们这时候已经实现了一个简单的, 美丽的, 优雅的, 但是并不十分可靠的MSN Robot J 咱们实现了接受用户消息, 接受到消息的回发, 发送消息, 添加好友, 删除好友, 对方加入咱们好友之后自动加上对方, 机器人已经活动了!

 



活过来吧! 擎天柱!

 


posted on 2007-08-15 09:09  阿鸟  阅读(3325)  评论(22编辑  收藏  举报