php websocket问题
我不熟悉web套接字。。我制作了我的第一个web套接字,现在在运行它时遇到了问题 这是插座的代码php websocket问题,php,javascript,websocket,Php,Javascript,Websocket,我不熟悉web套接字。。我制作了我的第一个web套接字,现在在运行它时遇到了问题 这是插座的代码 // set some variables $host = "127.0.0.1"; $port = 1234; // don't timeout! set_time_limit(0); // create socket $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n
// set some variables
$host = "127.0.0.1";
$port = 1234;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
if($socket){
echo "socket created .... $socket\n";
}
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
if($result){
echo "socket binded ... $result\n";
}
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
if($result){
echo "socket is now listening ... $result";
}
// accept incoming connections
// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
if($spawn){
echo $spawn."\n";
}
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
if($input){
echo $input."\n";
}
// clean up input string
$input = trim($input);
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
// close sockets
socket_close($spawn);
socket_close($socket);
现在我如何运行此代码??我在xampp shell上编写了以下代码:
php htdocs/socket/server.php -q
它显示:
socket created....Resource id #4
socket binded... 1
socket is now listening...1 Resource is #5
GET socket/server.php HTTP 1.1
upgrade: WebSocket
connection: Upgrade
Host: http://localhost
sec-WebSocket-key1: 14 53 8501 z4 5R'
sec-WebSocket-key2: S 9\ 2s63, *8460!~MO@
现在我如何运行它。。如何向它发送输入以及如何将其与JavaScript一起使用
我编写了一个JavaScript代码,但它连接了一秒钟,然后断开连接
以下是javascipt代码:
$(document).ready(function() {
if(!("WebSocket" in window)){
$('#chatLog, input, button, #examples').fadeOut("fast");
$('<p>Oh no, you need a browser that supports WebSockets. How about <a href="http://www.google.com/chrome">Google Chrome</a>?</p>').appendTo('#container');
}else{
//The user has WebSockets
connect();
function connect(){
var socket;
var host = "ws://localhost:1234/websocket_source_files/myown.php";
try{
var socket = new WebSocket(host);
message('<p class="event">Socket Status: '+socket.readyState);
socket.onopen = function(){
message('<p class="event">Socket Status: '+socket.readyState+' (open)');
}
socket.onmessage = function(msg){
message('<p class="message">Received: '+msg.data);
}
socket.onclose = function(){
message('<p class="event">Socket Status: '+socket.readyState+' (Closed)');
}
} catch(exception){
message('<p>Error'+exception);
}
function send(){
var text = $('#text').val();
if(text==""){
message('<p class="warning">Please enter a message');
return ;
}
try{
socket.send(text);
message('<p class="event">Sent: '+text)
} catch(exception){
message('<p class="warning">');
}
$('#text').val("");
}
function message(msg){
$('#chatLog').append(msg+'</p>');
}//End message()
$('#text').keypress(function(event) {
if (event.keyCode == '13') {
send();
}
});
$('#disconnect').click(function(){
socket.close();
});
}
}//End connect()
});
</script>
<title>WebSockets Client</title>
</head>
<body>
<div id="wrapper">
<div id="container">
<h1>WebSockets Client</h1>
<div id="chatLog">
</div>
<p id="examples">e.g. try 'hi', 'name', 'age', 'today'</p>
<input id="text" type="text" />
<button id="disconnect">Disconnect</button>
</div>
</div>
</body>
</html>
$(文档).ready(函数(){
如果(!(“窗口中的WebSocket”){
$(“#聊天记录,输入,按钮,#示例”).fadeOut(“快速”);
$(“哦,不,你需要一个支持WebSocket的浏览器。怎么样?”).appendTo(“#container”);
}否则{
//用户拥有WebSocket
connect();
函数连接(){
无功插座;
var host=“ws://localhost:1234/websocket\u source\u files/myown.php”;
试一试{
var套接字=新的WebSocket(主机);
消息(“套接字状态:”+Socket.readyState);
socket.onopen=函数(){
消息(“
套接字状态:“+Socket.readyState+”(打开)”;
}
socket.onmessage=函数(msg){
消息(“
套接字状态:“+Socket.readyState+”(已关闭)”;
}
}捕获(例外){
消息(“错误”+异常);
}
函数send(){
var text=$('#text').val();
如果(文本==“”){
消息(“
请输入消息”);
返回;
}
试一试{
socket.send(文本);
消息(“
已发送:”+文本)
}捕获(例外){
消息(“
”);
}
$('#text').val(“”);
}
功能信息(msg){
$(“#聊天记录”).append(msg+”
);
}//结束消息()
$('#text')。按键(函数(事件){
如果(event.keyCode==“13”){
send();
}
});
$(“#断开连接”)。单击(函数(){
socket.close();
});
}
}//端点连接()
});
WebSockets客户端
WebSockets客户端
例如,试试“你好”、“姓名”、“年龄”、“今天”
断开
请帮助我运行此代码并学习web套接字。。我真的需要在我的学校项目中使用它们。编写另一个连接到它的PHP脚本 socket\u accept-函数将阻塞(等待),直到客户端连接到它。这是标准行为 但是连接套接字后执行的函数不会阻塞(除非您告诉它们)。因此,您需要告诉脚本等待,直到它可以从套接字读取 为此,使用了。此外,您可能希望使用检查来检查任何可能的错误
尽管如此,我认为Java或C更适合使用套接字。您没有很好地进行握手 从您发布的内容来看,您正在处理ietf-00实现() 这已经过时了,最后一个似乎是ietf-10() 以下是您所需握手的基本描述: (您可以在其中找到更新的官方规范的链接) 在您的案例中,最重要的部分是: Sec-WebSocket-Key1和Sec-WebSocket-Key2字段以及8个字节 字段后面是服务器用来构造的随机令牌 握手结束时的16字节令牌,以证明其已读取 客户的握手 握手是通过连接来自 第一个键,并除以空格数。然后重复这一点 第二把钥匙。结果的两个数字用 每个字段后面的最后8个字节 最后的结果是连接字符串的MD5和。[7] 握手看起来像HTTP,但实际上不是。它允许服务器 将握手请求的一部分解释为HTTP,然后切换到 WebSocket。一旦建立,WebSocket数据帧就可以发回 在全双工模式下,在客户端和服务器之间来回移动。正文 帧可以同时向任意方向全双工发送 数据的最小帧只有两个字节。每帧开始 以0x00字节结尾,以0xFF字节结尾,并在中包含UTF-8数据 之间API中还不支持二进制帧。网袋 文本帧使用终止符,而二进制帧使用长度前缀 现在,一些代码(这将接受一个连接,接收一条消息,然后发送一个响应,就像一个非常基本和原始的示例来演示如何完成): 编辑: 这是一个非常基本的html,可以在chrome中使用(至少我是这样):
函数WebSocketTest()
{
如果(“窗口中的WebSocket”)
{
//让我们打开一个web套接字
var ws=newwebsocket(“ws://host:1026”);
ws.onopen=函数()
{
//已连接Web套接字,请使用send()发送数据
ws.send(“要发送的消息”);
console.log('send');
};
ws.onmessage=函数(evt)
{
收到的var_msg=evt.data;
控制台日志(收到消息);
var txt=document.createTextNode(已收到消息);
document.getElementById('messages').appendChild(txt);
};
ws.onclose=function()
{
//websocket已关闭。
console.log('close');
};
}
其他的
{
//浏览器不支持WebSocket
警报(“您的浏览器不支持WebSocket!”);
}
}
使用编辑器工具对您的文章进行适当的格式化,以便我们可以实际阅读……检查javascript代码。。它是accu
// Just to log to console
function myLog($msg)
{
echo date('m/d/Y H:i:s ', time()) . $msg . "\n";
}
// This will actually read and process the key-1 and key-2 variables, doing the math for them
function getWebSocketKeyHash($key)
{
$digits = '';
$spaces = 0;
// Get digits
preg_match_all('/([0-9])/', $key, $digits);
$digits = implode('', $digits[0]);
// Count spaces
$spaces = preg_match_all("/\\s/ ", $key, $dummySpaces);
$div = (int)$digits / (int)$spaces;
myLog('key |' . $key . '|: ' . $digits . ' / ' . $spaces . ' = ' . $div);
return (int)$div;
}
// This will read one header: value from the request header
function getWebSocketHeader($buffer, &$lines, &$keys)
{
preg_match_all("/([a-zA-Z0-9\\-]*)(\\s)*:(\\s)*(.*)?\r\n/", $buffer, $headers);
$lines = explode("\r\n", $buffer);
$keys = array_combine($headers[1], $headers[4]);
}
// This is where the handshake gets done
function handshake($peer)
{
$buffer = socket_read($peer, 4096, PHP_BINARY_READ);
socket_getpeername($peer, $address, $port);
$peerName = $address . ':' . $port;
myLog('Got from: ' . $peerName . ': ' . $buffer);
getWebSocketHeader($buffer, $lines, $keys);
if (!isset($keys['Sec-WebSocket-Key1']) || !isset($keys['Sec-WebSocket-Key2'])) {
myLog('Invalid websocket handshake for: ' . $peerName);
return;
}
$key1 = getWebSocketKeyHash($keys['Sec-WebSocket-Key1']);
$key2 = getWebSocketKeyHash($keys['Sec-WebSocket-Key2']);
$code = array_pop($lines);
// Process the result from both keys and form the response header
$key = pack('N', $key1) . pack('N', $key2) . $code;
myLog('1:|' . $key1 . '|- 2:|' . $key2 . '|3:|' . $code . '|4: ' . $key);
$response = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n";
$response .= "Upgrade: WebSocket\r\n";
$response .= "Connection: Upgrade\r\n";
$response .= "Sec-WebSocket-Origin: " . trim($keys['Origin']) . "\r\n";
$response .= "Sec-WebSocket-Location: ws://" . trim($keys['Host']) . "/\r\n";
$response .= "\r\n" . md5($key, true); // this is the actual response including the hash of the result of processing both keys
myLog($response);
socket_write($peer, $response);
}
// This is where you can send a frame (delimited by 0x00 and 0xFF)
function send($peer, $message)
{
socket_write($peer, pack('c', (int)0) . utf8_encode($message) . pack('c', (int)255));
}
// This is where you receive a frame (delimited again by 0x00 and 0xFF)
function receive($peer)
{
$buffer = socket_read($peer, 4096, PHP_BINARY_READ);
if (empty($buffer)) {
myLog('Error receiving from peer');
return;
}
return substr($buffer, 1, -1);
}
// Now create a socket
$socket = socket_create_listen(1026);
$peer = socket_accept($socket);
// Do the handshake and wait for an incoming message from the client
handshake($peer);
myLog('Got ' . receive($peer));
// Respond!
send($peer, 'hi there');
socket_close($peer);
socket_close($socket);
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
// Let us open a web socket
var ws = new WebSocket("ws://host:1026");
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("Message to send");
console.log('send');
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
console.log(received_msg);
var txt = document.createTextNode(received_msg);
document.getElementById('messages').appendChild(txt);
};
ws.onclose = function()
{
// websocket is closed.
console.log('close');
};
}
else
{
// The browser doesn't support WebSocket
alert("WebSocket NOT supported by your Browser!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">Run WebSocket</a>
</div>
<div id="messages">
</div>
</body>
</html>