擎天柱! 变形! 让咱们组装起来Message吧! DotMSN2.0 Robot(四)
2007-12-13 22:10
302 查看
转自:http://www.cnblogs.com/Bird/archive/2007/08/15/856167.html
内容记:
MSN Robot就是MSN机器人, 也可以喊成MSN聊天机器人.再解释就是会自动和你聊天的MSN,再再解释就是……啊, 我短路了(耳朵冒烟中)
本随笔是MSN Robot随笔系列第四篇, 内容是关于MSN Robot信息的最后结合.
前记:
神的右眼已经依稀可以看见梦想的征途…
昨天我们伟大的实现了一个message的实体类来处理信息的接收, 信息发送, 对话加入, 对话解除, 还有一点点的心跳, 就是session_close. ( 当然,这点心跳是远远不够的,看着我的眼睛,相信我,o,希望你是个女生 >__< ~~~ )
关于心跳讨论的结点比较多, 因为服务器总是有很奇怪的举动, 不把咱们T下线它总是良心不安的, 所以明天咱们单独讨论它就好了 J今天咱们继续来组合变形金刚吧~~
应该让它动起来了.
什么是一个机器人呢?它应该在收到用户发来的消息之后解析掉这个消息, 然后把答案回发给用户哟~~
哗, 真是个冠冕堂皇标准的回答. 不用理它, 咱们还是来看看代码怎么实现吧 J
// 当用户消息发过来的时候, 会触发ConversationCreated事件, 所以咱们要处理这个事件.
messenger.ConversationCreated += new
ConversationCreatedEventHandler(messenger_ConversationCreated);
[align=left]// 因为当用户发来消息的时候第一时间会来到这里[/align]
[align=left]private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)[/align]
[align=left]{[/align]
[align=left]// check if the request is initiated remote or by this object[/align]
[align=left]// if it is initiated remote then we have to create a conversation form. Otherwise the [/align]
[align=left]// form is already created and we don't need to create another one.[/align]
[align=left]if (e.Initiator == null)[/align]
[align=left]{[/align]
[align=left]// use the invoke method to create the form in the main thread[/align]
[align=left]this.Invoke(new CreateMessageDelegate(CreateMessage), new object[] { e.Conversation });[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]//创建一个线程运行Message实例[/align]
[align=left]private void CreateMessage(Conversation conversation)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] // 咱们在这里需要打开一个线程处理message, 因为语意分析和问题解决一定是堵塞型的[/align]
[align=left] // 所以咱们要考虑多用户同时请求时候的处理[/align]
[align=left]Thread depthMessage = new Thread(delegate()[/align]
[align=left]{[/align]
[align=left] // 开始执行一个Message实例[/align]
[align=left]Message mess = new Message(conversation, this);[/align]
[align=left]});[/align]
[align=left] [/align]
[align=left]depthMessage.Name = "Message";[/align]
[align=left]depthMessage.Start();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]这时候咱们和服务器的通讯是这样的:[/align]
[align=left] [/align]
>>> 为客户端套接字发送
<<< 为客户端套接字接收
[align=left] [/align]
[align=left] [/align]
[align=left]<<< RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh[/align]
[align=left]// 服务器说: 有一个哥们想跟你聊天诶[/align]
[align=left] [/align]
[align=left]>>> ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066[/align]
[align=left]// 咱们说: 行呀, 美女?! 大姐姐你爱吃青椒吗? &^^$%##$!@#!#!@[/align]
[align=left] [/align]
[align=left]<<< IRO 1 1 1 deaxxxx@hotmail.com Venkatesh 和 ANS 1 OK
// 服务器说, 月老牵线结束, 你们俩就可劲聊吧. Make love我都不管你.[/align]
[align=left] [/align]
[align=left]OK, 醒醒, 不YY了, 这时候咱们发现在第一步的时候触发了咱们温柔可爱贤惠善良的ConversationCreated事件, 而后咱们多线程创建了一个message处理这个对话. [/align]
[align=left] [/align]
[align=left]第二步暂时笔者尚未找到拒绝方法… -_-#... 难道男人来了咱们也得接受吗? #$@#%$#!#!^&^*^&[/align]
[align=left] [/align]
[align=left]但是在什么时候才触发第三步的接收呢? Bingo~ 答案自然是昨天帮助咱们解决掉null hell的message类中的Switchboard_ContactJoined事件.[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]OK! 简洁的今天让咱们再来看看发送消息的对接吧 J[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]// 发送消息按钮单击事件[/align]
[align=left]private void inviteButton_Click(object sender, System.EventArgs e)[/align]
[align=left]{[/align]
[align=left]string tempSender = richTextBox2.Text;[/align]
[align=left] [/align]
[align=left]// MSN消息有最高发送字数限制 J要注意哟, 太长了会引起error返回导致咱们的程序异常[/align]
[align=left]if (tempSender.Length > 800)[/align]
[align=left]{[/align]
[align=left]MessageBox.Show("发送长度不能超过");[/align]
[align=left]return;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]if (message == null)[/align]
[align=left]{[/align]
[align=left]return;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 开启一个线程处理message[/align]
[align=left]Thread depthMessage = new Thread(delegate()[/align]
[align=left]{[/align]
[align=left]if (ContactListView.SelectedItems.Count == 0)[/align]
[align=left]return;[/align]
[align=left] [/align]
[align=left]if (message.Conversation.Switchboard.Contacts.Count == 0)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left]// 获得Contact[/align]
[align=left]Contact selectedContact = (Contact)ContactListView.SelectedItems[0].Tag;[/align]
[align=left] [/align]
[align=left]// 创建对话[/align]
[align=left]Conversation Cconversation = messenger.CreateConversation();[/align]
[align=left] [/align]
[align=left]// 咱们需要先邀请好友加入咱们的会话, 然后在Message类中的join事件才能获得IRO的返回成功建立对话 J[/align]
[align=left]Cconversation.Invite(selectedContact);[/align]
[align=left] [/align]
[align=left]message = new Message(Cconversation, this);[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]message.SendInput(tempSender);[/align]
[align=left] [/align]
[align=left]});[/align]
[align=left] [/align]
[align=left]depthMessage.Name = "go";[/align]
[align=left]depthMessage.Start();[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]哦, 咱们需要了解一下Contact类就是咱们好友的资料合集, 可以点开看看这个类的包含 J很简单, 一般咱们在读取好友资料的时候把它绑定在好友项的tag上.[/align]
[align=left] [/align]
[align=left]咱们这时候已经实现了一个简单的, 美丽的, 优雅的, 但是并不十分可靠的MSN Robot J咱们实现了接受用户消息, 接受到消息的回发, 发送消息, 添加好友, 删除好友, 对方加入咱们好友之后自动加上对方,机器人已经活动了! [/align]
[align=left]
[/align]
[align=left]
活过来吧! 擎天柱![/align]
内容记:
MSN Robot就是MSN机器人, 也可以喊成MSN聊天机器人.再解释就是会自动和你聊天的MSN,再再解释就是……啊, 我短路了(耳朵冒烟中)
本随笔是MSN Robot随笔系列第四篇, 内容是关于MSN Robot信息的最后结合.
前记:
神的右眼已经依稀可以看见梦想的征途…
昨天我们伟大的实现了一个message的实体类来处理信息的接收, 信息发送, 对话加入, 对话解除, 还有一点点的心跳, 就是session_close. ( 当然,这点心跳是远远不够的,看着我的眼睛,相信我,o,希望你是个女生 >__< ~~~ )
关于心跳讨论的结点比较多, 因为服务器总是有很奇怪的举动, 不把咱们T下线它总是良心不安的, 所以明天咱们单独讨论它就好了 J今天咱们继续来组合变形金刚吧~~
应该让它动起来了.
什么是一个机器人呢?它应该在收到用户发来的消息之后解析掉这个消息, 然后把答案回发给用户哟~~
哗, 真是个冠冕堂皇标准的回答. 不用理它, 咱们还是来看看代码怎么实现吧 J
// 当用户消息发过来的时候, 会触发ConversationCreated事件, 所以咱们要处理这个事件.
messenger.ConversationCreated += new
ConversationCreatedEventHandler(messenger_ConversationCreated);
[align=left]// 因为当用户发来消息的时候第一时间会来到这里[/align]
[align=left]private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)[/align]
[align=left]{[/align]
[align=left]// check if the request is initiated remote or by this object[/align]
[align=left]// if it is initiated remote then we have to create a conversation form. Otherwise the [/align]
[align=left]// form is already created and we don't need to create another one.[/align]
[align=left]if (e.Initiator == null)[/align]
[align=left]{[/align]
[align=left]// use the invoke method to create the form in the main thread[/align]
[align=left]this.Invoke(new CreateMessageDelegate(CreateMessage), new object[] { e.Conversation });[/align]
[align=left]}[/align]
[align=left]}[/align]
[align=left]//创建一个线程运行Message实例[/align]
[align=left]private void CreateMessage(Conversation conversation)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left] // 咱们在这里需要打开一个线程处理message, 因为语意分析和问题解决一定是堵塞型的[/align]
[align=left] // 所以咱们要考虑多用户同时请求时候的处理[/align]
[align=left]Thread depthMessage = new Thread(delegate()[/align]
[align=left]{[/align]
[align=left] // 开始执行一个Message实例[/align]
[align=left]Message mess = new Message(conversation, this);[/align]
[align=left]});[/align]
[align=left] [/align]
[align=left]depthMessage.Name = "Message";[/align]
[align=left]depthMessage.Start();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]这时候咱们和服务器的通讯是这样的:[/align]
[align=left] [/align]
>>> 为客户端套接字发送
<<< 为客户端套接字接收
[align=left] [/align]
[align=left] [/align]
[align=left]<<< RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh[/align]
[align=left]// 服务器说: 有一个哥们想跟你聊天诶[/align]
[align=left] [/align]
[align=left]>>> ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066[/align]
[align=left]// 咱们说: 行呀, 美女?! 大姐姐你爱吃青椒吗? &^^$%##$!@#!#!@[/align]
[align=left] [/align]
[align=left]<<< IRO 1 1 1 deaxxxx@hotmail.com Venkatesh 和 ANS 1 OK
// 服务器说, 月老牵线结束, 你们俩就可劲聊吧. Make love我都不管你.[/align]
[align=left] [/align]
[align=left]OK, 醒醒, 不YY了, 这时候咱们发现在第一步的时候触发了咱们温柔可爱贤惠善良的ConversationCreated事件, 而后咱们多线程创建了一个message处理这个对话. [/align]
[align=left] [/align]
[align=left]第二步暂时笔者尚未找到拒绝方法… -_-#... 难道男人来了咱们也得接受吗? #$@#%$#!#!^&^*^&[/align]
[align=left] [/align]
[align=left]但是在什么时候才触发第三步的接收呢? Bingo~ 答案自然是昨天帮助咱们解决掉null hell的message类中的Switchboard_ContactJoined事件.[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]OK! 简洁的今天让咱们再来看看发送消息的对接吧 J[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]// 发送消息按钮单击事件[/align]
[align=left]private void inviteButton_Click(object sender, System.EventArgs e)[/align]
[align=left]{[/align]
[align=left]string tempSender = richTextBox2.Text;[/align]
[align=left] [/align]
[align=left]// MSN消息有最高发送字数限制 J要注意哟, 太长了会引起error返回导致咱们的程序异常[/align]
[align=left]if (tempSender.Length > 800)[/align]
[align=left]{[/align]
[align=left]MessageBox.Show("发送长度不能超过");[/align]
[align=left]return;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]if (message == null)[/align]
[align=left]{[/align]
[align=left]return;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]// 开启一个线程处理message[/align]
[align=left]Thread depthMessage = new Thread(delegate()[/align]
[align=left]{[/align]
[align=left]if (ContactListView.SelectedItems.Count == 0)[/align]
[align=left]return;[/align]
[align=left] [/align]
[align=left]if (message.Conversation.Switchboard.Contacts.Count == 0)[/align]
[align=left]{[/align]
[align=left] [/align]
[align=left]// 获得Contact[/align]
[align=left]Contact selectedContact = (Contact)ContactListView.SelectedItems[0].Tag;[/align]
[align=left] [/align]
[align=left]// 创建对话[/align]
[align=left]Conversation Cconversation = messenger.CreateConversation();[/align]
[align=left] [/align]
[align=left]// 咱们需要先邀请好友加入咱们的会话, 然后在Message类中的join事件才能获得IRO的返回成功建立对话 J[/align]
[align=left]Cconversation.Invite(selectedContact);[/align]
[align=left] [/align]
[align=left]message = new Message(Cconversation, this);[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]message.SendInput(tempSender);[/align]
[align=left] [/align]
[align=left]});[/align]
[align=left] [/align]
[align=left]depthMessage.Name = "go";[/align]
[align=left]depthMessage.Start();[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]哦, 咱们需要了解一下Contact类就是咱们好友的资料合集, 可以点开看看这个类的包含 J很简单, 一般咱们在读取好友资料的时候把它绑定在好友项的tag上.[/align]
[align=left] [/align]
[align=left]咱们这时候已经实现了一个简单的, 美丽的, 优雅的, 但是并不十分可靠的MSN Robot J咱们实现了接受用户消息, 接受到消息的回发, 发送消息, 添加好友, 删除好友, 对方加入咱们好友之后自动加上对方,机器人已经活动了! [/align]
[align=left]
[/align]
[align=left]
活过来吧! 擎天柱![/align]
相关文章推荐
- 擎天柱! 变形! 让咱们组装起来Message吧! DotMSN2.0 Robot(四) [原鸟]
- 当机器人遇到咱们, 就要聊聊天. Message! DotMSN2.0 Robot(三) [原鸟]
- 当机器人遇到咱们, 就要聊聊天. Message! DotMSN2.0 Robot(三)
- 好吧, 先从连接开始. DotMSN2.0 Robot(一)
- 是呀, 没有好友的MSN是孤独的 DotMSN2.0 Robot(二) [原鸟]
- 是呀, 没有好友的MSN是孤独的 DotMSN2.0 Robot(二)
- 使用DotMSN 2.0开发MSN机器人 http://www.cnblogs.com/hjf1223/archive/2008/01/16/dotmsn_robot.html
- 使用DotMSN 2.0开发MSN机器人 http://www.cnblogs.com/hjf1223/archive/2008/01/16/dotmsn_robot.html
- 好吧, 先从连接开始. DotMSN2.0 Robot(一) [原鸟]
- 转-使用DotMSN 2.0开发MSN机器人
- 发布二个asp.net 2.0控件(MessagePanel and CollapsiblePanel)
- “公司运作你来负责好了,今后公司就是你的了,本来咱们的小公司也是咱们一起办起来的。”
- FireFox 2.0 预览版用起来太爽了!!!
- OAuth 2.0 认证(结合大家的,然后合并起来的!)
- 重大改变!DotMSN于今天开放了源代码,并升级到2.0版本!!
- 简介 WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对
- 组装示范程序@GTK+ 2.0 中文教程连载
- 重大改变!DotMSN于今天开放了源代码,并升级到2.0版本!!
- Robot 第四周(机体组装和研究动力学建模)
- 让咱们的OpenCms在MyEcplise中跑起来