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

简介

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38649.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开悟和通货膨胀!!!

大家好&#xff0c;我是txp&#xff0c;今天给大家聊一个非技术性的话题&#xff1a;开悟和抵抗通货膨胀。 不知道大家看到这两个词的时候&#xff0c;是什么感觉&#xff0c;可以停顿一下&#xff0c;让自己思考一下&#xff01; 在展开这个话题之前&#xff0c;我先总结一下自…

网红马斯克的无聊公司

西雅图IT圈&#xff1a;seattleit 【今日作者】拖拉机 IT圈里烧柴油的干货担当 16年底 美国钢铁侠 埃隆马斯克 成立了一家叫做 The Boring Company &#xff08;无聊公司&#xff09; 的微商公司 开始的时候 马斯克声称这家公司 主要从事挖隧道这种无聊的工作 然而这家公司的主…

UE4 摇杆JoyStick-Touch Interface Setup

1.创建 2、属性 USTRUCT() struct FTouchInputControl {GENERATED_USTRUCT_BODY()//自由活动图片// basically mirroring SVirtualJoystick::FControlInfo but as an editable classUPROPERTY(EditAnywhere, Category"Control", meta(ToolTip"For sticks, this …

算法:第一节课Master定理

1、ctex&#xff1a;要求用Tex编辑器进行作业的书写 2、与东大本科有差距&#xff0c;还需要多点努力才行。 3、 4、考试不考概念 5、 6、时间复杂度和空间复杂度 7、算法好坏的评价标准 8、基本运算 9、时间复杂度 10、第二章&#xff1a;重要的来了 11、 12、 13、 假设矩阵…

马斯克 超级计算机,特斯拉布局超级计算机 野心是全自动驾驶

美东时间周一举行的2021年计算机视觉和模式识别会议上&#xff0c;特斯拉人工智能与自动驾驶视觉部门主管安德烈卡帕蒂(Andrej Karpathy)公布了特斯拉超级计算机集群Dojo。卡帕蒂表示&#xff0c;Dojo尚未进行基准测试&#xff0c;根据FLOPS的排名来看&#xff0c;第五位的英伟…

100offer举办的「寻找实干和坚持的技术力量」开源项目投票排名分析程序

2019独角兽企业重金招聘Python工程师标准>>> 由于100offer举办的「寻找实干和坚持的技术力量」开源项目投票活动没有按照票数排序的功能&#xff0c;所以本文写了个小程序来实现这个功能&#xff0c;代码如下&#xff1a; import org.jsoup.Jsoup; import org.jsoup…

qt解析joystick飞行摇杆按键信息

项目场景&#xff1a; 最近入手一款图马斯特飞行摇杆&#xff0c;本来是想用来玩游戏&#xff0c;但是想到以前做过遥控车&#xff0c;如果用这个来代替遥控器应该比较爽&#xff0c;于是用Qt编写了一个解析手柄按键信息的demo软件。 测试效果还不错&#xff1a;下面是demo软…

马思特中国实现2020年全年盈利目标300%

近日&#xff0c;全球著名的金属加工液解决方案企业马思特液体解决方案&#xff08;以下称“马思特”&#xff09;公布了2020年度中国区业绩&#xff0c;基于公司在技术研发和人力资源两方面的投入和行业优势&#xff0c;2020年度马思特中国在疫情蔓延下仍然逆势向上&#xff0…

马斯洛提出动机理论_动机理论:工作背后的动力机制

是什么在激励你努力工作呢?下面的要素你是如何排序的?通过填写这样的题项,我们大致能了解到一个人工作的动机是什么,作为雇主我们能根据自身的情况挑选我们需要的某种动机类型的员工,或者设计出更高效的方式来更好满足已有员工需求,为员工创造更大的价值,最终也能够让员…

先进制造业不断发展,马思特以三大优势服务中国市场

近日&#xff0c;马思特液体解决方案&#xff08;以下称“马思特”&#xff09;公布中国区业绩。得益于公司团队的密切协作&#xff0c;马思特中国2020上半年即实现全年盈利目标的140%。 “在如此困难的时期一家公司能够保持盈利&#xff0c;有赖于所有员工的共同努力。”马思特…

马思特php,全面解析曝光图马思特t300和t300rs有何区别?哪个好?爆料真实使用心得...

这两款图马思特t300和t300rs区别还是有的哈&#xff0c;款式和配置是不一样的&#xff0c;图马思特T300RSTH8A手柄套餐更大气一些&#xff0c;我自己用的是图马思特T300RSTH8A手柄套餐&#xff0c;性价比蛮高的&#xff0c;款式也是我喜欢的&#xff0c;多时尚的&#xff0c;整…

如何评价马云和马斯克在世界人工智能大会的对话?

来源&#xff1a;刘锋的未来课堂 马云和马斯克在世界人工智能大会的对话&#xff0c;虽然风轻云淡&#xff0c;天马行空&#xff0c;但两个人其实是针锋相对的&#xff0c;马云的观点是认为人工智能还是人类的工具&#xff0c;为人类的未来提供服务&#xff0c;马斯克继续保持他…

C++面向对象编程(类和对象)

全部学完提供一个练习的项目&#xff0c;在博主的主页可以找到该免费资源 文章目录 一、封装示例1&#xff1a;访问权限struct 和 class 区别检测数据有效性&#xff1a;练习1&#xff1a;练习2&#xff1a;构造函数析构函数构造函数的调用和分类拷贝构造函数调用时机初始化列表…

马斯克要求推特工程师默写代码,开始着手整顿美国职场?

要说世间谁最熟悉代码&#xff0c;程序员敢说第二&#xff0c;应该没人敢称第一。但这群和代码打交道最多的人&#xff0c;也会被代码难住&#xff0c;比如被要求默写一段代码&#xff01; 最近&#xff0c;马斯克要求推特工程师默写代码登上热搜榜&#xff0c;成为网友们讨论…

互联网日报 | 3月22日 星期一 | 苹果iMac Pro全球下架;知乎更新上市招股书;字节跳动成立朝夕光年奇想基金...

今日看点 ✦ 知乎更新招股书&#xff1a;最高融资超10亿美元&#xff0c;腾讯阿里京东认购 ✦ 字节跳动成立朝夕光年奇想基金&#xff08;NIF&#xff09;&#xff0c;将投资游戏创业团队 ✦ 京东云联合京东物流、京东生鲜共同打造“京东冷链溯源平台” ✦ 工商银行资产托管规模…

关于苹果开发者协议更新的相关问题

最近进入开发者中心相信大家都会看到如下图所示的信息&#xff0c;同时最近很多道友在群里咨询有关开发者协议更新的问题&#xff0c;基本可以肯定的是密保问题答案给忘记了&#xff0c;忘记密保问题就真的不能更细协议了&#xff1f;当然不是&#xff0c;接下里就给大家介绍一…

ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集实战

介绍 ChatGLM-6B是开源的文本生成式对话模型,基于General Language Model(GLM)框架,具有62亿参数,结合模型蒸馏技术,实测在2080ti显卡训练中上(INT4)显存占用6G左右, 优点:1.较低的部署门槛&#xff1a; FP16 半精度下&#xff0c;ChatGLM-6B 需要至少 13GB 的显存进行推理&a…

羊驼系列大模型和ChatGPT差多少?详细测评后,我沉默了

来源&#xff1a;机器之心 本文约5100字&#xff0c;建议阅读10分钟一番深入测评&#xff0c;结果令人深思。 总的来说&#xff0c;该测试得出的结论是&#xff1a;MPT 还没有准备好在现实世界中使用&#xff0c;而 Vicuna 对于许多任务来说是 ChatGPT (3.5) 的可行替代品。 前…

向AI提问,我是怎么做的?

AI对话与人完全不同。 人对话过程基于情感、文化背景、现状&#xff0c;需要考虑对方情绪、语气、表情等非语言因素&#xff0c;AI对话更多基于逻辑、数据、算法&#xff0c;更加注重信息传递和问题解决。 尽管各家都在推崇自然语言处理技术&#xff08;(Natural Language Pr…

24个好用到爆的Python实用技巧

作为一名数据工作者&#xff0c;我们每天都在使用 Python处理大多数工作。在此过程中&#xff0c;我们会不断学到了一些有用的技巧和窍门。 在这里&#xff0c;我尝试以 A - Z 开头的格式分享这些技巧中的一些&#xff0c;并且在本文中简单介绍这些方法&#xff0c;如果你对其中…