首页 > 编程知识 正文

实时聊天技术用什么实现,java聊天室实现带界面

时间:2023-05-03 15:56:29 阅读:111947 作者:1391

本文介绍了如何使用workerman实现实时聊天。 有一定的参考价值,有需要的朋友可以参考,希望对大家有帮助。

开发文档: http://doc2.workerman.net/

下载服务器端安装文件:

有两个版本: windows版和linux版。 我下载的linux版也可以在windows上运行。

打开后,有以下文件:

此文件可以放在服务器上,也可以放在项目中。 需要执行的是最后一个start_for_win.bat文件。

执行成功了。

要修改start_gateway.php文件? php

//*

* this文件is part of worker man。

*

*许可证under the MIT许可证

* forfullcopyrightandlicenseinformation,please see the MIT-LICENSE.txt

* redistributionsoffilesmustretaintheabovecopyrightnotice。

*

* @author walkor

* @版权所有walk or

* @link http://www.workerman.net/

* @ license http://www.open source.org/licenses/MIT-license.phpmitlicense

*/

use 工作器manworker;

useworkermanweb服务器;

use 网关工作器网关;

use 网关工作器业务工作器;

use WorkermanAutoloader;

//自动加载类

require _ once _ _ dir _.'/./vendor/autoload.PHP ';

//网关进程,这里是文本协议,可以在telnet上进行测试

$ gateway=new gateway (网络套接字://0.0.0. 033608282 );

//网关名称,status易于查看

$gateway-name='YourAppGateway ';

//网关进程数

$网关-计数=4;

//本机ip,分布式部署时使用内部网ip

$网关- lanip=' 127.0.0.1 ';

//如果内部通信开始端口$gateway-count=4,则开始端口为4000

//4000400140024003的4个端口一般用作内部通信端口

$网关-开始端口=2900;

//服务注册地址

$网关-注册地址=' 127.0.0.133601238 ';

//心率间隔

$网关- ping间隔=60;

//心率数据

$网关- ping data=' { ' type ' : ' ping ' };

/*

//设置客户端连接时通过连接的onWebSocketConnect (即websocket )握手时的回调

$网关-连接=function ($连接)。

{

$ connection-onwebsocketconnect=function $ connection,$http_header )

{

//这里判断连接源是否合法,不合法就可以断开连接

//$_SERVER['HTTP_ORIGIN']标识从哪个站点的页面到web套接字的链接已启动

if($_SERVER['HTTP_ORIGIN']!='http://kedou.workerman.net ' )

{

$connection-close (;

}

//onWebSocketConnect中提供了$_GET $_SERVER

//var_dump($_get,$_SERVER );

(;

(;

*/

//否则

在根目录启动,则运行runAll方法

if(!defined('GLOBAL_START'))

{

Worker::runAll();

}

第24行,把tcp协议改为websocket协议;

第38行和40行,设置服务器向客户端发送的心跳时间,检测客户端是否连接,未连接将会断开。

下面的内容都是默认注释掉的,根据自己的需要打开或者修改。

再次运行start_for_win.bat文件:

协议就变为websocket协议了,现在就可以做项目内的操作了。

还需要再下载一个文件:https://github.com/walkor/GatewayClient

把这几个文件放进thinkphp的extend文件夹下(我用的是thinkphp5.0版本):

在Gateway.php的文件中方法几乎都写好了。

写了一个简单的前端页面:

ws://127.0.0.1:8282

发送

{volist name="msg" id="vo" empty="这里没有数据" key ='s'}

{$vo.user_name}:

{$vo.msg}

{$vo.createtime}

{/volist}

// var ws = new WebSocket("ws://123.56.216.232:8282");

var ws = new WebSocket("ws://127.0.0.1:8282");

ws.onopen = function() {

$('#msgUl').append('

已连接上...')

sendValue();

};

ws.onmessage = function(evt) {

$('#msgUl').append('

接收到:' + evt.data + '')

var obj = JSON.parse(evt.data);

if (obj.type == 'onConnect') {

// 连接成功

$('#msgUl').append('

client_id:' + obj.client_id + '')

$.ajax({

type:"POST",

url:"/index.php/api/Index/user_bind",

data:{

client_id:obj.client_id

},

dataType: "html",

success: function(data){

console.log('成功')

}

});

} else if (obj.type == 'ping') {

// 心跳检测 不做任何处理

} else if (obj.type == 'chatGroup') {

// 群组聊天

$('#msgUl').append('

接收到:' + evt.data + '')

}

};

ws.onclose = function() {

// console.log('连接已关闭...');

$('#msgUl').append('

连接已关闭...')

};

function sendValue() {

$('#sendButton').click(function() {

var thisValue = $('#sendValue').val();

if (thisValue) {

ws.send(thisValue);

$('#msgUl').append('

发送数据:' + thisValue + '')

$.get("/index.php/api/Index/send_msg/msg/"+thisValue,function (data,status) {

console.log('成功:'+thisValue)

});

}

})

}

第42—52行把client_id传到后台,与用户表中用户进行绑定。

后台代码:<?php

namespace appapicontroller;

use thinkController;

use GatewayClientGateway;

use thinkDb;

class Index extends Controller

{

public function websocket(){

$where=[];

$user_id=1;

$where['from_id|to_id']=$user_id;

$msg=Db::name('msg')->where($where)->select();

foreach ($msg as $key=>$val){

$msg[$key]['createtime']=date('Y-m-d H:i:s',$val['createtime']);

$msg[$key]['user_name']=Db::name('user')->where(['id'=>$val['from_id']])->value('name');

}

$this->assign('msg',$msg);

return view();

}

//绑定用户

public function user_bind($user_id=1){

//$user_id=1; //发送人用户id

$client_id = input('post.client_id');

// $user=Db::name('user')->where(['id'=>$user_id])->find();

Gateway::bindUid($client_id, 1);

return $client_id;

}

//发送信息

public function send_msg(){

$msg=input('msg');

if($msg){

$data=[

'msg'=>$msg,

'from_id'=>1,

'to_id'=>2,

'createtime'=>time()

];

Db::name('msg')->insert($data);

Gateway::sendToUid(1,$msg);

Gateway::sendToUid(2,$msg);

}

return 'success';

}

}

发送消息存入数据库,页面显示即可。

更多计算机编程相关知识,请访问:编程视频!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。