简介

PHP匿名在线聊天室源码/自定义群组聊天系统/可设置密码支持自适应多端访问运营版,一款支持多国语言的在线群聊系统源码,可以新建一个群组,然后设置密码,或者公开访问都可以,聊天都是匿名的,方式还是不错的,搭建了一下系统亲测可完美运营,有需要的可以学习研究一下。

实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSocket,当然HTML5目前在PC端并没有被所有浏览器支持,所以我的这个聊天室仍是基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室,这个聊天室其实是我上周周末完成的,功能简单,可能有些不足,但可以满足在线即时聊天需求,分享也是给大家提供一个思路,大家可以基于此来实现更好的在线即时聊天工具。

聊天室功能简介:

1。支持多人进入同一个聊天室聊天;

2。进入即离线均会自动生成通知信息显示在聊天室中,这样聊天的人们就知道谁进来了谁离开了;

3。实时显示在线人员表列;

4。无需数据库支持,全部存在内存中,当然有条件的可以采用分布式缓存或加一个数据库来存,这里演示就是用内存来存了。

下面就开始分享我的代码,由于采用原生的JS及AJAX,所以简单易懂,代码分别WEB前端及服务端(有点废话了)

WEB前端源代码如下:(ChatPage.html)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title></title>

    <style type="text/css">

        html, body {

            margin: 0px;

            padding: 0px;

            width: 100%;

            height: 100%;

            background-color: #f8f7f7;

            font-family: arial,sans-serif;

        }

        #layouttable {

            margin:0px;

            padding:0px;

            width:100%;

            height:100%;

            border:2px solid green;

            border-collapse:collapse;

            min-width:800px;

        }

            #layouttable td {

                border: 1px solid green;

            }

        .h100p {

            height:100%;

        }

        .midtr{height:auto;}

            .midtr tr td {

                height: 100%;

            }

        #chatmsgbox, #chatonlinebox {

            background-color:white;

            overflow-x: hidden;

            overflow-y: auto;

            overflow-wrap: break-word;

            height: 100%;

        }

        #chatonlinebox {

            background-color:#f5d0a8;

        }

        .rc, .sd {

            overflow:hidden;

        }

         .rc p {

            float: left;

            color: green;

        }

            .sd p {

                float: right;

                color: orange;

            }

    </style>

</head>

<body>

    <table id="layouttable">

        <colgroup>

            <col style="width:auto" />

            <col style="width: 200px;" />

        </colgroup>

        <tr style="height:30px; background-color:lightblue;color:yellow;">

            <td>

                欢迎进入梦在旅途的网页即时在线大众聊天室 - www.zuowenjun.cn:

            </td>

            <td>

                当前在线人员

            </td>

        </tr>

        <tr style="height:auto;" id="midtr">

            <td>

                <div id="chatmsgbox">

                </div>

            </td>

            <td>

                <div id="chatonlinebox">

                    <ul id="chatnames"></ul>

                </div>

            </td>

        </tr>

        <tr style="height:50px;">

            <td colspan="2">

                <label for="name">聊天妮称:</label>

                <input type="text" id="name" style="width:80px;" />

                <input type="button" id="btnsavename" value="确认进入" />

                <label for="msg">输入内容:</label>

                <input type="text" id="msg" style="width:400px;" />

                <input type="button" id="btnSend" value="发送消息" disabled="disabled" />

            </td>

        </tr>

    </table>

    <script type="text/javascript">

        var chatName = null;

        var oChatmsgbox, oMsg, oChatnames;

        var ajaxforSend, ajaxforRecv;

        //页面加载初始化

        window.onload = function () {

            document.getElementById("btnsavename").onclick = function () {

                this.disabled = true;

                var oName = document.getElementById("name");

                oName.readOnly = true;

                document.getElementById("btnSend").disabled = false;

                //receiveMsg();

                setChatStatus(oName.value,"on");

            }

            document.getElementById("btnSend").onclick = function () {

                sendMsg(oMsg.value);

            };

            //init

            oChatmsgbox = document.getElementById("chatmsgbox");

            oMsg = document.getElementById("msg");

            oChatnames = document.getElementById("chatnames");

            ajaxforSend = getAjaxObject();

            ajaxforRecv = getAjaxObject();

        }

        //离开时提醒

        window.onbeforeunload = function () {

            event.returnValue = "您确定要退出聊天室吗?";

        }

        //关闭时离线

        window.onunload = function () {

            setChatStatus(chatName, "off");

        }

        //设置聊天状态:在线 OR 离线

        function setChatStatus(name, status) {

            callAjax(getAjaxObject(), "action=" + status + "&name=" + name, function (rs) {

                if (!rs.success) {

                    alert(rs.info);

                    return;

                }

                if (status == "on") {

                    chatName = document.getElementById("name").value;

                    setTimeout("receiveMsg()",500);

                }

                loadOnlineChatNames();

            });

        }

        //加载在线人员名称列表

        function loadOnlineChatNames(){

            callAjax(getAjaxObject(), "action=onlines", function (rs) {

                var lis = "";

                for(var i=0;i<rs.length;i++)

                {

                    lis += "<li>"+ rs[i] +"</li>";

                }

                oChatnames.innerHTML = lis;

            });

        }

        //接收消息列表

        function receiveMsg() {

            callAjax(ajaxforRecv, "action=receive&name=" + chatName, function (rs) {

                if (rs.success) {

                    showChatMsgs(rs.msgs, "rc");

                }

                setTimeout("receiveMsg()", 500);

            });

        }

        //发送消息

        function sendMsg(msg) {

            callAjax(ajaxforSend, "action=send&name=" + chatName + "&msg=" + escape(msg), function (rs) {

                if (rs.success) {

                    showChatMsgs(rs.msgs, "sd");

                    oMsg.value = null;

                    //alert("发送成功!");

                }

            });

        }

        //显示消息

        function showChatMsgs(msgs, cssClass) {

            var loadonline = false;

            for (var i = 0; i < msgs.length; i++) {

                var msg = msgs[i];

                oChatmsgbox.innerHTML += "<div class='" + cssClass + "'><p>[" + msg.name + "] - " + msg.sendtime + " 说:<br/>" + msg.content + "</p></div>";

                if (msg.type == "on" || msg.type == "off")

                {

                    loadonline = true;

                }

            }

            if (loadonline)

            {

                loadOnlineChatNames();

            }

        }

        //调用AJAX

        function callAjax(ajax, param, callback) {

            ajax.open("post", "ChatHandler.ashx", true);

            ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

            ajax.onreadystatechange = function () {

                if (ajax.readyState == 4 && ajax.status == 200) {

                    var json = eval("(" + ajax.responseText + ")");

                    callback(json);

                }

            };

            ajax.send(param);

        }

        //获取AJAX对象(XMLHttpRequest)

        function getAjaxObject() {

            var xmlhttp;

            if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari

                xmlhttp = new XMLHttpRequest();

            }

            else {// code for IE6, IE5

                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

            }

            return xmlhttp;

        }

    </script>

</body>

</html>

代码很简单,并都有注释,在此就不作说明了,如果有疑问欢迎在下方评论。

服务端(ChatHandler.ashx) 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

<%@ WebHandler Language="C#" Class="ChatHandler" %>

using System;

using System.Web;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Web.Script.Serialization;

using System.Threading;

using System.Collections.Concurrent;

public class ChatHandler : IHttpHandler

{

    private class Msg

    {

        public string name { getset; }

        public string sendtime { getset; }

        public string content { getset; }

        public string readednams { getset; }

        public int readedCount { getset; }

        public string type { getset; }

    }

    private static List<Msg> msgs = new List<Msg>();

    private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

    private static object syncObject = new object(),syncObject1 = new object();

    private static List<string> onLineNames = new List<string>();

    public void ProcessRequest(HttpContext context)

    {

        string chatName = context.Request.Form["name"];

        string msg = context.Request.Form["msg"];

        string actionName = context.Request.Form["action"];

        JavaScriptSerializer jsSerializer = new JavaScriptSerializer();

        object responseObject = null;

        switch (actionName)

        {

            case "receive":

                {

                    responseObject = GetNewMessages(chatName);

                    break;

                }

            case "send":

                {

                    responseObject = SendMessage(chatName, msg, "normal");

                    break;

                }

            case "on":

            case "off":

                {

                    responseObject = SetChatStatus(chatName, actionName);

                    break;

                }

            case "onlines":

                {

                    responseObject = onLineNames;

                    break;

                }

        }

        context.Response.ContentType = "text/json";

        context.Response.Write(jsSerializer.Serialize(responseObject));

    }

    private object SetChatStatus(string chatName, string status)

    {

        if (status == "on")

        {

            if (onLineNames.Exists(s => s == chatName))

            {

                return new { success = false, info = "该聊天妮称已经存在,请更换一个名称吧!" };

            }

            lock (syncObject1)

            {

                onLineNames.Add(chatName);

            }

            SendMessage(chatName, "大家好,我进入聊天室了!", status);

            return new { success = true, info = string.Empty };

        }

        else

        {

            lock (syncObject1)

            {

                onLineNames.Remove(chatName);

            }

            SendMessage(chatName, "再见,我离开聊天室了!", status);

            return new { success = true, info = string.Empty };

        }

    }

    /// <summary>

    /// 获取未读的新消息

    /// </summary>

    /// <param name="chatName"></param>

    /// <returns></returns>

    private object GetNewMessages(string chatName)

    {

        //第一种:循环处理

        while (true)

        {

            var newMsgs = msgs.Where(m => m.name != chatName && !(m.readednams ?? "").Contains(chatName)).OrderBy(m => m.sendtime).ToList();

            if (newMsgs != null && newMsgs.Count() > 0)

            {

                lock (syncObject)

                {

                    newMsgs.ForEach((m) =>

                    {

                        m.readednams += chatName + ",";

                        m.readedCount++;

                    });

                    int chatNameCount = onLineNames.Count();

                    msgs.RemoveAll(m => m.readedCount >= chatNameCount);

                }

                return new { success = true, msgs = newMsgs };

            }

            Thread.Sleep(1000);

        }

        //第二种方法,采用自旋锁

        //List<Msg> newMsgs = null;

        //SpinWait.SpinUntil(() =>

        //{

        //    newMsgs = msgs.Where(m => m.name != chatName && !(m.readednams ?? "").Contains(chatName)).OrderBy(m => m.sendtime).ToList();

        //    return newMsgs.Count() > 0;

        //}, -1);

        //rwLock.EnterWriteLock();

        //newMsgs.ForEach(m =>

        //{

        //    m.readednams += chatName + ",";

        //    m.readedCount++;

        //});

        //rwLock.ExitWriteLock();

        //return new { success = true, msgs = newMsgs };

    }

    /// <summary>

    ///

    /// </summary>

    /// <param name="chatName"></param>

    /// <param name="msg"></param>

    /// <returns></returns>

    private object SendMessage(string chatName, string msg, string type)

    {

        var newMsg = new Msg() { name = chatName, sendtime = DateTime.Now.ToString("yyyy/MM/dd HH:mm"), content =HttpContext.Current.Server.HtmlEncode(msg), readednams = null, type = type };

        //rwLock.EnterWriteLock();

        lock (syncObject)

        {

            msgs.Add(newMsg);

        }

        //rwLock.ExitWriteLock();

        return new { success = true, msgs = new[] { newMsg } };

    }

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}

代码也相对简单,实现原理主要是:

1。聊天消息:循环获取未读的消息,在取出读的消息同时,将其标识为已读,全部已读的消息则删除;--我这里采用了两种方法,第二种方法被注释掉了,大家可以取消注释试试,也是不错的,比第一种更直观,建议使用;

2。发送消息:实例化一个消息实例并加入到聊天消息集合中;

3。状态切换:上线则加入到在线人员集合中,并生成一条上线消息放入到聊天消息集合中,离线则从在线人员集合中移除该人员信息,并生成一条离线消息放入聊天消息集合中;

注意事项,由于采用了全局静态集合,所以线程同步比较重要。

最终的实现效果展示如下:

张三:

李四:

小美:

如果觉得不错的话,给个推荐吧,你的支持是推动我不断前进的动力及写作的源泉,我一直坚持:知识在于分享,分享的同时自己也在成长,希望与大家共同成长,谢谢!

演示截图

更新说明

2021/5/3 更新

新增房间删除,用户删除,铭感聊天词汇屏蔽

新增生日,国家,性别个性图标

新增主题优化雪花特效

新增语音在线发送,语音聊天

新增2,000多种表情符号

新增首页聊天室搜索

新增聊天室用户搜索

新增聊天室最近文件展示

==================================

无限聊天室

-您可以在其中创建无限的聊天室。您还可以允许用户创建和管理自己的聊天室。

私人聊天消息/一对一聊天

用户可以使用专用私密聊天室或一对一聊天功能无缝地彼此聊天。他们可以使用此功能私下分享他们想要的任何东西。管理员也可以通过管理控制台管理任何用户聊天信息。

更改主题和配色方案

内置白天及黑夜的用户风格界面。您可以通过管理信息中心轻松地在用户界面之间切换。如果要自定义主题颜色,则可以轻松切换到自定义UI并根据需要选择颜色。

多国语言支持

内置的语言和翻译管理器。您可以有效地添加自己的语言和翻译。可翻译为包括RTL语言在内的任何语言。它支持任何Unicode字符集。

受密码保护的聊天室

用户可以在其聊天室中添加密码。知道密码的人可以进入聊天室。这样您可以拥有受密码保护的聊天室。

匿名游客

管理员可以允许匿名游客访问网站。您可以为单个聊天室打开或关闭此功能。您可以允许游客在进入聊天室时更改姓名。

仅限会员和仅管理员聊天室

创建聊天室时,您可以选择可以访问该聊天室的人。您可以只有管理员或只有成员的聊天室。或者您可以选择所有用户类型,并允许访客加入聊天室。

隐藏或秘密聊天室

有时您可能想从前端隐藏聊天室。拥有直接链接到聊天室的用户将能够查看并登录到隐藏或秘密的聊天室。此外您可以使用密码保护隐藏的聊天室以增强安全性。

热门聊天室模式

如果你需要网站用户看到你推荐的网站可以在后台设置推荐房间,这样用户就能很方面的看到推送房间并加入到其中啦

封禁用户

管理员或聊天室创建者可以从聊天室中封禁用户或解除用户。被封禁的用户将无法再次登录同一聊天室。管理员可以通过管理控制台控制用户访问整个网站。

发送GIF表情包

用户可以在房间随意放松自己想要分享的GIF动图也可以上传自己本地图片,为您的聊天室增添更多乐趣

用户资料

用户可以设置自己的登录邮箱及密码,还可以设置自己的聊天昵称和个人签名,聊天室当中只会显示昵称和个人签名,信息越少安全越高

输入状态

在与对方用户聊天过程中,你可以在聊天室页面看到对方如果在输入消息时的按键输入状态效果

密码加密

使用强大的哈希算法和bcrypt算法来生成和验证密码。这样便拥有强大的密码安全系统。

声音通知

用户收到聊天消息时将听到通知声音。他们可以通过单击静音按钮将其静音以进行特定的聊天。

功能说明

1. 无限聊天室

您可以在其中创建无限的聊天室。您还可以允许用户创建和管理自己的聊天室。

2.私人聊天消息/一对一聊天

用户可以使用专用私密聊天室或一对一聊天功能无缝地彼此聊天。他们可以使用此功能私下分享他们想要的任何东西。管理员也可以通过管理控制台管理任何用户聊天信息。

3.更改主题和配色方案

内置白天及黑夜的用户风格界面。您可以通过管理信息中心轻松地在用户界面之间切换。如果要自定义主题颜色,则可以轻松切换到自定义UI并根据需要选择颜色。

4.多国语言支持

内置的语言和翻译管理器。您可以有效地添加自己的语言和翻译。可翻译为包括RTL语言在内的任何语言。它支持任何Unicode字符集。

5.受密码保护的聊天室

用户可以在其聊天室中添加密码。知道密码的人可以进入聊天室。这样您可以拥有受密码保护的聊天室。

6.匿名游客

管理员可以允许匿名游客访问网站。您可以为单个聊天室打开或关闭此功能。您可以允许游客在进入聊天室时更改姓名。

7.仅限会员和仅管理员聊天室

创建聊天室时,您可以选择可以访问该聊天室的人。您可以只有管理员或只有成员的聊天室。或者您可以选择所有用户类型,并允许访客加入聊天室。

8.隐藏或秘密聊天室

有时您可能想从前端隐藏聊天室。拥有直接链接到聊天室的用户将能够查看并登录到隐藏或秘密的聊天室。此外您可以使用密码保护隐藏的聊天室以增强安全性。

9.热门聊天室模式

如果你需要网站用户看到你推荐的网站可以在后台设置推荐房间,这样用户就能很方面的看到推送房间并加入到其中啦

10.封禁用户

管理员或聊天室创建者可以从聊天室中封禁用户或解除用户。被封禁的用户将无法再次登录同一聊天室。管理员可以通过管理控制台控制用户访问整个网站。

11.发送GIF表情包

用户可以在房间随意放松自己想要分享的GIF动图也可以上传自己本地图片,为您的聊天室增添更多乐趣

12.用户资料

用户可以设置自己的登录邮箱及密码,还可以设置自己的聊天昵称和个人签名,聊天室当中只会显示昵称和个人签名,信息越少安全越高

13.输入状态

在与对方用户聊天过程中,你可以在聊天室页面看到对方如果在输入消息时的按键输入状态效果

14.密码加密

使用强大的哈希算法和bcrypt算法来生成和验证密码。这样便拥有强大的密码安全系统。

15.声音通知

用户收到聊天消息时将听到通知声音。他们可以通过单击静音按钮将其静音以进行特定的聊天。

下载地址

https://download.csdn.net/download/q906270629/19825061

【亲测可运营】PHP匿名在线聊天室/语音聊天室/多国语言版在线聊天室相关推荐

  1. 有没有在线文字转语音的方法?在线文字转语音的方法介绍

    有没有在线文字转语音的方法?很多时候我们在进行视频制作的时候,都需要给视频进行配音.有的时候我们直接添加一个背景音乐就可以了,但有的时候我们的文案需要朗读出来.如果自己本身声音好听,也还比较专业,那么 ...

  2. 【亲测可运营】2021年全民摆摊速摆摊全开源地摊经济大众摆摊对接短信宝多种支付

    简介 后台技术栈 程序基于 THINKPHP6+VUE 全新开发,保障安全的同时大大提高代码执行效率.后台管理UI 基于新版本的LayUI 前端框架,使得后台管理简洁明了,管理员一目了然:同时使用了R ...

  3. 知识付费平台 最新源码免费分享 全部可运营 亲测 在线付费 在线课堂 在线考试 在线收费 在线直播 统统满足你

    目标客户:针对中小型教育培训机构,涵盖:k12教育.素质教育.成人教育.学历教育.留学教育.企业培训.英语培训.少儿培训.家庭教育.志愿填报.生涯规划等,知识付费网校运营者. 解决问题:基于产品.服务 ...

  4. 【亲测】80个经典在线休闲H5小游戏源码合集,直接上传空间即可使用,可玩性还不错

    约有八十个左右的H5小休闲游戏,代码无加密,上传即可使用,可以拿来放自己网站上引流,提升用户体验和黏度; 游戏的可玩性还是挺好的,可算得上是引流神器. 不需要建新站 直接上传到任意站点都可以运行. 游 ...

  5. 可用的公开 RTSP/ RTMP 在线视频流资源地址(亲测可行)

    可用的公开 RTSP/ RTMP 在线视频流资源地址(亲测可行) 时间节点:2023/01/23 rtsp: rtsp://wowzaec2demo.streamlock.net/vod/mp4:Bi ...

  6. 微信聊天防封 亲测 百分之95有效 【附源码】

    微信聊天防封 亲测 百分之95有效 [附源码] 把你想发给某一个人的"一句话改变成一张图片"" 并在文字的外围加上框,来实现防封 默认快捷键AIt+Q ,可以隐藏或显示主 ...

  7. 亲测无限坐席在线客服系统源码,基于ThinkPHP的一款在线客服系统源码

    源码简介 东西没问题,和别人换的本来说是多语言带机器人翻译之类的,给了个这... 直接一键安装的,启动两个端口就行了,安装倒是简单 编号:ym270 品牌:无 语言:PHP 大小:34.5MB 类型: ...

  8. PHP服务器在线测速系统源码+亲测可用

    正文: PHP服务器在线测速系统源码+亲测可用,已经可以近乎准确地测试本地到服务端的上下行速度和延迟波动轻量化程式. 下载方式: lanzou.com/ivMJb02uthla

  9. 最新亲测云赏在线视频打赏源码V8.5修复完整版

    正文: 云赏在线视频打赏源码+V8.1版本+V8.5终结版+V8.5修复完结版+已购和包天包周包月功能+码支付+qq乐支付+大产付+安装教程(文字+视频) V8.1版本:带已购.包天功能,对接好全新极 ...

  10. c语言字母简化 aaa 3a,中国石油大学(华东)C语言在线测评答案 第10章字符串(2013级亲测正确).docx...

    中国石油大学(华东)C语言在线测评答案 第10章字符串(2013级亲测正确).docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理 ...

最新文章

  1. 一种生成不重复数的算法
  2. base64图片保存获取本地路径
  3. Lamp安装与实现动态网页案例(一)
  4. python自然语言处理_python
  5. 云服务器BBC销售渠道,云服务器BBC控制台
  6. 3 Sum Closest
  7. web前端的进阶路线大剖析!初学者如何迅速“升级”!
  8. 防抖与节流方案_函数防抖和节流
  9. 微软Skype推出Slack整合预览版
  10. java中程序定义book类_Java基础_0302:类和对象
  11. 卸载symantec endpoint protection
  12. 【重点】commons-dbutils
  13. 优盘扩容修复 u盘工具
  14. 企业微信sdk调用流程
  15. Selenium GUI自动化下载百度图片
  16. 基于Java的学生兼职平台设计与实现
  17. 英伟达守望先锋巡回赛开启 上海/深圳/沈阳/重庆英雄齐聚
  18. C++整型(short,int,long,longlong)
  19. B2c商城系统介绍源码
  20. 刚入行软件测试,去大公司好还是小公司好?

热门文章

  1. 软工视频-----系统结构图
  2. MySQL数据库通过data文件夹恢复数据库信息
  3. FIR滤波器和IIR滤波器
  4. 数据结构——线段树学习笔记
  5. 32G内存服务器如何设置虚拟内存,大内存服务器设置虚拟内存
  6. 云计算机根据部署,华为云计算FusionCompute环境部署实验之使用批量部署工具安装...
  7. ajax下载表格文件
  8. python实现A星算法(寻路)
  9. android软件安装到平板,新人看过来 安卓平板装机必备软件推荐
  10. GitHub中文排行榜