即时通讯

IM(InstantMessaging 即时通讯,实时传讯) 这是一种可以让使用者在网络上建立某种私人聊天室(chatroom)的实时通讯服务。

到底什么才算是实时,至少我认为 我们将要实现的不算是实时,我们将要通过“轮询”实现。如果刚接触 Ajax 或者仅对该领域有所了解,“轮询” 的概念可能让您感到害怕。不幸的是,轮询是惟一的办法。要在客户机和服务器之间建立连续管道,同时又不需要在两端安装特定软件,尚不存在可实现此目的的跨平台、跨浏览器方法。即便这样,可能还需要对防火墙进行专门配置才行得通。因此,如果需要人人能用的一种简便办法,Ajax 和轮询是惟一的可能。



jQuery 是什么?

jQuery 由 John Resig 创建于 2006 年初,对于任何使用 JavaScript 代码的程序员来说,它是一个非常有用的 JavaScript 库。无论您是刚刚接触 JavaScript 语言,并且希望获得一个能解决文档对象模型(Document Object Model,DOM)脚本和 Ajax 开发中一些复杂问题的库,还是作为一个厌倦了 DOM 脚本和 Ajax 开发中无聊的重复工作的资深 JavaScript 专家,jQuery 都会是您的首选。

jQuery 能帮助您保证代码简洁易读。您再也不必编写大堆重复的循环代码和 DOM 脚本库调用了。使用 jQuery,您可以把握问题的要点,并使用尽可能最少的代码实现您想要的功能。

毫无疑问,jQuery 的原理是独一无二的:它的目的就是保证代码简洁并可重用。

好了不再罗嗦了,让我们立即开始吧。


第一步建立一个登录页面

1. <html>
2. <head><title>用户登录页面</title></head>
3. <body>
4. <form action="chat.php" method="post">
5. 用户名: <input type="text" name="username">
6. <input type="submit" value="Login">
7. </form>
8. </body>
9. </html>

作用:要给聊天者一个身份标识。这就需要一个简单的登录页。这里就不过多说明了。


第二步建立数据存储
我们需要将聊天的内容等存储起来以便让聊天者之间通过 服务器 实现聊天内容的交互,这里我们选择数据库存储,当然您也可以直接用xml存储等。

我们在mysql服务器上建立一个IM数据库 并且在IM数据库里面 建立一个表

1. DROP TABLE IF EXISTS messages;
2.
3. CREATE TABLE messages (
4. message_id INTEGER NOT NULL AUTO_INCREMENT,
5. username VARCHAR(255) NOT NULL,
6. message TEXT,
7. PRIMARY KEY ( message_id )
8. );

message_id 表主键 username 存储聊天者的身份标识 message 存储说话的内容。

第三步 基本的用户聊天界面


1. <?php
2. session_start();
3. if ( array_key_exists( 'username', $_POST ) ) {
4. $_SESSION['user'] = $_POST['username'];
5. }
6. $user = $_SESSION['user'];
7. ?>
8. <html>
9. <head><title><?php echo( $user ) ?> - Chatting</title>
10. <script src="js/jquery.js"></script>
11. </head>
12. <body>
13. <div id="chat" style="height:400px;overflow:auto;">
14. </div>
15.
16. <script>
17. $(document).ready(function(){
18. $("#add_btn").click(function(){
19. $.ajax({
20. type: "POST",
21. url: "add.php",
22. data:$("#chatmessage").serialize(),
23. success: function(msg){ $("#messagetext").val(""); }
24. });
25. });
26.
27. });
28.
29. </script>
30.
31. <form id="chatmessage">
32. <textarea name="message" id="messagetext">
33. </textarea>
34. </form>
35.
36. <button ID="add_btn">Add</button>
37.
38. <script>
39. var lastid=0;
40. function getMessages()
41. {
42.
43. $.ajax({
44. type: "POST",
45. url: "message.php",
46. data: "lastid="+lastid,
47. success: function(xml){
48. $(xml).find('messagelist > message').each(function(){
49. $("#chat").html($("#chat").html()+
50. $(this).find("user").text()+
51. ":"+$(this).find("msg").text()+"<br>");
52. lastid=$(this).find("id").text();
53.
54. });
55. window.setTimeout( getMessages, 1000 );
56. }
57.
58. });
59. }
60. getMessages();
61. </script>
62.
63. </body>
64. </html>



代码说明:
首先我们需要获得用户的身份标识并且将它存储在session里面。

1. <?php
2. session_start();
3. if ( array_key_exists( 'username', $_POST ) ) {
4. $_SESSION['user'] = $_POST['username'];
5. }
6. $user = $_SESSION['user'];
7. ?>

当我们输入完我们的发言时通过点击 add按钮 将发言内容发送到服务器上 存储在数据库里面这样别的用户通过读取数据库记录就能看到我们的发言了。

1. <script>
2. $(document).ready(function(){
3. $("#add_btn").click(function(){
4. $.ajax({
5. type: "POST",
6. url: "add.php",
7. data:$("#chatmessage").serialize(),
8. success: function(msg){ $("#messagetext").val(""); }
9. });
10. });
11.
12. });
13.
14. </script>

下面这段代码就是通过 每1秒 向服务器发送请求来获得 发言的信息。

1. <script>
2. var lastid=0;
3. function getMessages()
4. {
5.
6. $.ajax({
7. type: "POST",
8. url: "message.php",
9. data: "lastid="+lastid,
10. success: function(xml){
11. // $("#chat").html(xml);
12. //var nodes=$("messagelist > message",xml);
13. //alert(nodes.length);
14.
15. //alert(xml);
16. $(xml).find('messagelist > message').each(function(){
17. //($(this).find("id").text()).appendTo("#chat");
18. $("#chat").html($("#chat").html()+$(this).find("user").text()+":"+$(this).find("msg").text()+"<br>");
19. lastid=$(this).find("id").text();
20. //alert($(this).find("id").text());
21. });
22. window.setTimeout( getMessages, 1000 );
23.
24.
25. }
26.
27. });
28. }
29. getMessages();
30. </script>

有人可能要问 那个lastid 是做什么的?

页面每秒请求一次对话的所有聊天记录。虽然对于较短的对话影响不大,但是如果对话很长,性能问题就显现出来了。所幸的是解决起来很简单。每条消息都有 message_id,这个数字自动递增。因此,如果知道已经有了属于某个 ID 的消息,只需要请求出现在此 ID 之后的消息就可以。这样可以大大降低消息传递的数量。多数请求很可能没有新的消息,传递的包就会变小。

添加发言程序:
add.php


1. <?
2. session_start();
3. ?>
4. <?
5. mysql_connect("localhost","root","") or die("无法连接数据库");
6. mysql_query("INSERT INTO im.messages VALUES ( null,'".$_SESSION['user']."', '".$_POST['message']."' )");
7. ?>

读取消息程序:



1. <?
2. session_start();
3. header('Content-type: text/xml');
4. ?>
5. <messagelist>
6. <?php
7. mysql_connect("localhost","root","") or die("无法连接数据库");
8. $row = mysql_query('SELECT * FROM im.messages where message_id >'.intval($_POST["lastid"]) );
9. while( $field=mysql_fetch_array($row ) )
10. {
11. ?>
12. <message>
13. <id><?php echo($field[0]) ?></id>
14. <user><?php echo($field[1])?></user>
15. <msg><?php echo($field[2]) ?></msg>
16. </message>
17. <?php
18. }
19. ?>
20. </messagelist>

好了赶快调试一下吧,是不是已经实现了基本的聊天功能.
WebIM说明 WebIM是一款基于jQuery的一款web即时通讯插件,姑且这么称呼吧。插件最大程度实现了IM的常用功能,除即时通讯的常用功能外,还加入了:消息盒子、窗口抖动、添加删除好友、最近联系人、超时登录界面、网站小秘书、聊天记录、发送频率限制、发送产品、发送名片、发送表情、产品分享、黑名单、举报、收藏、公告、智能网址过滤、消息提醒、修改资料、名片二维码、禁止粘贴、收起联系人列表、推荐好友等30余项改进。全浏览器兼容。 插件调用简单方便,只需在现有的web系统中加入几行代码,理论上可嵌入任何web系统。 2012年项目,已不再维护。 配置 $(function() { $(document).FnWebIM({ autoLogin :true, //boolean型,默认是否自动登录,true:自动登录,false:手动登录,默认为true msgRefreshTime :1000, //number型,消息刷新时间,单位为ms friendRefreshTime :10000, //number型,好友刷新时间,单位为ms showSecretary :true, //boolean型,默认是否显示小秘书,true:显示,false:不显示,默认为true noticeContent :"唐僧师徒历经千辛万苦,终于见到了佛祖……", //string型,公告内容 为空时不显示公告 sendPicture :true, //boolean型,是否允许发送图片,true:允许,false:不允许,默认为true msgMaxSize :300, //number型,单条消息最大允许字符 msgSound :false, //boolean型,是否开启声音提醒,true:开启,false:关闭,默认为true defaultWindow :"" //string型,登录后打开新聊天窗口,此处接收的参数为联系人的uid,否则会出错 }); }); 详细说明文档 http://www.zi-han.net/case/im/help.html 示例 http://www.zi-han.net/developer/721.html 注意 请在服务器(如localhost)环境下打开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值