我有一种情况,我需要根据另一个浏览器的输入来更新一个浏览器窗口。现在,我正在使用WebSockets,并且效果很好。
现在,我想使用PHP而不是浏览器将数据发送到WebSocket(因此,使用PHP代码代替ws://)。换句话说,我想使用PHP而不是JavaScript模拟WebSocket.send()调用。
我有以下似乎无效的代码(onmessage没有被调用):
if (
function_exists('socket_create') AND
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) AND
$sock_data = socket_connect($sock, "127.0.0.1", 12345)
) {
$msg = "hello world";
$sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //Set
$sock_data = socket_write($sock, $msg, strlen($msg)); //Send data
socket_close($sock); //Close socket
}
Run Code Online (Sandbox Code Playgroud) 我有一个websocket客户端/服务器,可以与Firefox和Chrome 18完美配合.它不适用于Chrome 19 beta.我怀疑这是由于这个浏览器现在使用我的服务器不支持的deflate-frame扩展.
Chrome 19测试版正在握手:"Sec-WebSocket-Extensions:x-webkit-deflate-frame"
我让我的服务器发回:"Sec-WebSocket-Extensions:"
但要么这不是拒绝扩展的正确方法,要么是我没有抓到的其他错误.这是握手中唯一不同于我从工作浏览器中看到的东西.
编辑:这是一些额外的信息.这些是Wireshark捕获的握手.
使用Firefox 12的握手:
GET /的ChatServer HTTP/1.1
主机:(省略这个岗位)
的User-Agent:Mozilla的/ 5.0(Windows NT的6.1; WOW64; RV:12.0)的Gecko/20100101火狐/ 12.0
接受:text/html的,是application/xhtml + xml的,应用/ XML; q = 0.9,/ q = 0.8
的Accept-Language:EN-US,连接; q = 0.5
的Accept-Encoding:gzip的,放气
DNT:1个
连接:保持活着,升级
仲丁基的WebSocket-版本:13
来源:(此帖略)
Sec-WebSocket-Key:2TKm4ozUQdNP17Lobt7IBg ==
Pragma:no-cache
Cache-Control:no-cache
升级:websocket
HTTP/1.1 101交换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:pSUB3BT9YUUd9n3mOeWY/1uVqJE =
使用Chrome 18的握手:
GET /的ChatServer HTTP/1.1
升级:网页套接字
连接:升级
主机:(省略了此篇)
来源:(省略了此篇)
仲丁基WebSocket的密钥:zuHLEC8pGvAMadarhCLXFA ==
仲丁基的WebSocket-版本:13
HTTP/1.1 101交换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:LMBSq6Bk9Kiv + zAbQlAL899pfzc =
使用Chrome 19的握手:
GET /的ChatServer HTTP/1.1
升级:网页套接字
连接:升级
主机:(省略了这个职位) …
几天前,我从http://code.google.com/p/phpwebsocket/设置了这个WebSocket服务器
通过使用Xampp,它在我的localhost上运行良好.然后,我将它上传到我在Strato上的网站空间,但现在我无法连接到服务器.
我将套接字连接更改为我的域,但它没有用
Client.html:
var host = "ws://xxxxxxxx.com:12345/Websocket/server.php";
Run Code Online (Sandbox Code Playgroud)
Server.php:
$master = WebSocket("xxxxxx",12345);
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用不同的端口(80,443,12345,8080,8000 ....),使用server.php中的IP地址而不是域.
我还在client.html中使用了绝对路径和相对路径.
从项目页面http://code.google.com/p/phpwebsocket/有人建议在server.php中使用0或0.0.0.0,但这也没有用.
在client.html中它只显示:
WebSocket - 状态0已断开连接 - 状态3
我猜这个问题是Strato阻止我使用WebSockets.是否可以在我的网站空间上运行WebSockets?
我现在进入Web套接字并且已成功使用在线websockets Pusher(不喜欢它)和Scribble(令人惊讶但停机时间太频繁,因为它只是一个人运行它).
我在本地主机上遵循了本教程http://www.flynsarmy.com/2012/02/php-websocket-chat-application-2-0/,效果很好!
我想问的是,如何从上面的文件中设置server.php作为在线webhost /共享服务器上的websocket服务器运行?
或者我是否需要获得VPS(如果是这样,你推荐哪一个,我如何在那里设置websocket服务器,因为我之前从未真正使用过VPS!)
非常感谢您阅读我的问题和回答.我已经阅读了关于套接字的所有其他问题/答案,但还没有找到我上述问题的答案.希望我在这里找到它!
我正在制作 iOS 聊天应用程序。在研究了所需的技术和协议后,我决定尝试使用 websockets。由于我们的堆栈顶部是基于 php 的原因,我开始了解棘轮作为 PHP 的 websockets。我通过阅读文档为 ios 前端制作了简单的聊天服务器。聊天工作得很好,我也很满意。我想知道如何创建单独的私人聊天室。是否需要为不同的房间运行不同的套接字事件循环实例?
我制作的示例服务器使用单个事件循环来管理用户连接并将消息分派到不同的连接/用户 ID。我真的很想创建私人聊天室,但没有找到任何我可以确信的信息。
我是否必须在此事件循环中虚拟地管理每个连接/用户 ID,例如通过控制消息的分发来决定哪些用户可以直接相互聊天?或者他们真的是一种单独的方式来做到这一点?这是我实现的文档中的事件循环示例:
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
Run Code Online (Sandbox Code Playgroud)
我想说的是,我是一名 iOS/Android 开发人员,真的没有专家或对 Web 前端/后端技术有流利的知识。
我想知道有多少客户实际上订阅了聊天室/会话.
更确切地说,我只想知道是否有超过1个客户端.(聊天室实际上是两个用户之间的私密对话).
一次只有一个聊天室/私人对话(每个用户).
class Chat implements WampServerInterface
{
protected $conversationId;
public function __construct(){
$this->conversationId = null;
}
public function onSubscribe(ConnectionInterface $conn, $conversation_id){
$this->conversationId = $conversation_id;
echo "Client $conn->resourceId assigned to the conversation : $conversation_id\n";
}
public function onPublish(ConnectionInterface $conn, $conversation_id, $event, array $exclude, array $eligible){
// How to get $nb_clients ?
echo "$nb_clients User(s) in conversation";
echo "Message sent to $conversation_id : $event";
// ...
$message = $event;
// Send data to conversation
$this->conversationId->broadcast($message);
}
}
Run Code Online (Sandbox Code Playgroud)
那么在给定的代码中,如何获得$ nb_clients?
更新:
我想我开始看到一个解决方案了. …
我正在开发一个Web应用程序,我需要以下场景的实时行为,
应用程序将有两种类型的用户Player和Spectator.玩家可以加入正在进行的游戏,而观众只能观看比赛.
游戏将由管理员用户初始化.
观众基本上可以看到加入游戏的人员名单.当然,当玩家断开连接或新玩家加入游戏观众时,这需要是实时意义的.
总而言之,请考虑以下示例
Spectator_1 joins Clan_101
Spectator_2 joins Clan_201
Player_1 joins Clan_101 // Need to broadcast this event to Spectator_1
Player_2 joins Clan_101 // Need to broadcast this event to Spectator_1
Player_1 disconnects Clan_101 // // Need to broadcast this event to Spectator_1
Player_11 joins Clan_201 // Need to broadcast this event to Spectator_2
Player_12 joins Clan_201 // // Need to broadcast this event to Spectator_2
Run Code Online (Sandbox Code Playgroud)
考虑到正在进行的游戏作为主题/频道(Ratchet\Wamp\Topic),我需要向观众播放以下事件player …
所以,我正在运行一个Ratchet(php)websocket服务器,它有多个连接多个Ratchet应用程序的路由(MessageComponentInterfaces):
//loop
$loop = \React\EventLoop\Factory::create();
//websocket app
$app = new Ratchet\App('ws://www.websocketserver.com', 8080, '0.0.0.0', $loop);
/*
* load routes
*/
$routeOne = '/example/route';
$routeOneApp = new RouteOneApp();
$app->route($routeOne, $routeOneApp, array('*'));
$routeTwo = '/another/route';
$routeTwoApp = new AnotherApp();
$app->route($routeTwo, $routeTwoApp, array('*'));
Run Code Online (Sandbox Code Playgroud)
从这里我绑定一个ZMQ套接字,以便能够接收从普通的apache服务器上运行的php脚本发送的消息.
// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new \React\ZMQ\Context($loop);
$pull = $context->getSocket(\ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5050'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('message', array($routeOneApp, 'onServerMessage'));
Run Code Online (Sandbox Code Playgroud)
最后,服务器启动: …
我在 Ratchet PHP 中创建了一个聊天应用程序。它在使用 WAMP 的本地计算机上运行良好。我希望它在实时服务器上设置。
\n\n在我的服务器上我有:
\n\n我没有的:
\n\niptables我运行了php server.php它,给出了有关服务器已启动并在端口 9000 上侦听的成功消息。但是当 HTML 页面尝试使用 ws://domain:9000 连接它时,它会遇到错误 -
\n\n\nFirefox 可以\xe2\x80\x99t 与位于\n ws://domain.com:9000/ 的服务器建立连接
\n
我用谷歌搜索了很多,看来我需要的是一个用于入站连接的端口。
\n\n但根据这个答案, 我需要的是 Ratchet 的 PHP 支持才能在共享主机上工作。任何人都可以解释我真正需要什么,如果它在我的服务器上的列表中不可用,是否有任何解决方法。
\n我尝试运行一个 websocket 应用程序(基于 php 的聊天),并且需要从通过执行以下命令获得的 Handshake 标头中获取Sec-WebSocket-Key :
$socket_new = socket_accept($socket);
$header = socket_read($socket_new, 5000);
但是我的标头中缺少所需的属性...在这里您可以看到重新查看的标头的打印。WebSocket 客户端通常应该自己设置这个参数?!
GET / HTTP/1.1
Host: X.XXX.XXX.XXX:9000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: csrftoken=ZiNFgXXXXNYSoi0XkCtiudR00aHwm; sessionid=7s2pdmfvchwylXXXXtqv0rzbn7bd
Run Code Online (Sandbox Code Playgroud)
我用 Firefox 和 Chrome 尝试过,我的服务器在 Debian 服务器上运行。我需要在我的服务器上安装一些东西(比如任何 WebSocket 库)吗?
或者为什么缺少 Sec-WebSocket 属性?