我想在webapp中创建聊天应用程序,用户可以在其中与不同的站点用户聊天。这将在网上和iOS上提供。
我没有使用传统的轮询技术(以1秒的间隔向服务器发送ajax命中),而是想使用websockets。
通过几个教程,但在所有这些教程中,他们已经让PUBLIC GROUP聊天。 (示例网址:https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket)
任何人都可以了解如何使用PHP& amp;的WebSockets。
我对websockets有基本的想法但是如何使用它们在特定频道上发布数据?如果我们有40个用户,那么我们需要创建40个不同的频道吗?
提前致谢。
答案 0 :(得分:2)
与单一的全球聊天和多个私人频道没什么不同。首先,您需要设计一个协议。让我们创建一个简单的协议:
// client send to server
JOIN <channel_id>
LEAVE <channel_id>
MSG <channel_id> <message>
// server send to client
JOIN <channel_id> <username>
LEAVE <channel_id> <username>
MSG <channel_id> <username> <message>
JOIN <channel_id>
时。将JOIN <channel_id> <username>
广播到该频道中的所有连接。MSG <channel_id> <message>
时。将MSG <channel_id> <username> <message>
广播到该频道中的所有连接。所以基本上,WebSocket提供了一种基本的沟通方式,你应该有创意去做事。
答案 1 :(得分:1)
对于私人(房间)聊天系统,您必须开发自己的逻辑。 我建议你使用以下库:
在http://socketo.me/docs/浏览他们的文档并开始编码。 如果您遇到困难,请发布您的代码,社区随时为您提供帮助
答案 2 :(得分:0)
这就是我在Laravel中所做的,你需要安装Predis,socket.io,ratchet和其他依赖项。请检查https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51
使用棘轮
创建一个自定义artisan命令以在某个端口上运行websocketsnamespace App\Console\Commands;
use Illuminate\Console\Command;
use Ratchet\Server\IoServer;
class webSockets extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'run:socket {port?}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Run websockets for specified port';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$port = $this->argument('port');
$server = IoServer::factory(
new ChatController(),$port
$server->run();
}
}
您的控制器应如下所示
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class ChatController implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
}
public function onMessage(ConnectionInterface $from, $msg) {
//FIRE A BROADCAST EVENT HERE
event(new MessageBroadcast(
$message,
$datetime,
$user_id
)
);
}
public function onClose(ConnectionInterface $conn) {
}
public function onError(ConnectionInterface $conn, \Exception $e) {
}
}
广播级应该如下所示
namespace App\Events;
use App\Events\Event;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
class MessageBroadcast extends Event implements ShouldBroadcast
{
use SerializesModels;
public $message,$datetime,$userid;
public function __construct($message,$datetime,$userid)
{
$this->message = $message;
$this->datetime = $datetime;
$this->userid = $userid;
}
public function broadcastOn()
{
return ['test-channel'.$this->user_id];
}
}
Javascript部分订阅频道
<script src="{ { asset('js/socket.io.js') } }"></script>
<script>
//var socket = io('http://localhost:3000');
var socket = io('http://yourip:5000');
socket.on("test-channel1:App\\Events\\EventName", function(message){
// get user on console
console.log(message);
});
</script>
您需要在backgroud中运行以下命令
1. php artisan run:socket <port_no>
2. Node yourjavascript.js