包含socketio.jsclose的詞條

本文目錄一覽:

nodejs socket 怎麼檢測客戶端主動斷開連接

根據 文檔中說是在transport連接 (就是TCP)Close後再等一段時間(15秒,可配置)釋放資源。我們知道一般TCP 不會輕易Close,網站沒數據,可能連接一直存在着。

所以有兩種思路,一個是自己在在Scoket.io的業務層設置定時器,超過一段時間無業務數據,釋放socket.io的資源。另一種就是把TCP連接超時時間設短,不過要注意socket.io的socket不是node.js的socket,可以參考以下代碼:

io.sockets.on(‘connection’, function (socket) {

socket.manager.transports[socket.id].socket.setTimeout(15000);

//…

}

如果client關閉後,大約15+15秒之後會釋放資源。

javascript怎麼操作socket

參考下面方法

// 創建一個Socket實例

var socket = new WebSocket(‘ws://localhost:8080’);

// 打開Socket

socket.onopen = function(event) {

// 發送一個初始化消息

socket.send(‘I am the client and I\’m listening!’);

// 監聽消息

socket.onmessage = function(event) {

console.log(‘Client received a message’,event);

};

// 監聽Socket的關閉

socket.onclose = function(event) {

console.log(‘Client notified socket has closed’,event);

};

// 關閉Socket….

//socket.close()

};

參數為URL,ws表示WebSocket協議。onopen、onclose和onmessage方法把事件連接到Socket實例上。每個方法都提供了一個事件,以表示Socket的狀態。

socketio 不是標準的websocket?為什麼java寫的client端連不上

php有可用的websocket庫,不需要php-fpm。

目前比較成熟的有swoole(swoole.com),和workman(workman.net)

swoole是c寫的php擴展, 效率比nodejs還要高,workman是純php實現,兩者都號稱可以實現並發百萬TCP連接。

給你個例子:

這個要通過cmd運行的 具體帶的參數有點忘記了

?php

error_reporting(E_ALL);

set_time_limit(0);

ob_implicit_flush();

//創建一個socket連接 設置參數 綁定 監聽 並且返回

$master = WebSocket(“localhost”,12345);

//標示是否已經進行過握手了

$is_shaked = false;

//是否已經關閉

$is_closed = true;

//將socket變為一個可用的socket

while(true){

//如果是關閉狀態並且是沒有握手的話 則創建一個可用的socket(貌似第二個條件可以去除)

if($is_closed !$is_shaked){

if(($sock = socket_accept($master)) 0){

echo “socket_accept() failed: reason: ” . socket_strerror($sock) . “\n”;

}

//將關閉狀態修改為false

$is_closed = false;

}

//開始進行數據處理

process($sock);

}

//處理請求的函數

function process($socket){

//先從獲取到全局變量

global $is_closed, $is_shaked;

//從socket中獲取數據

$buffer = socket_read($socket,2048);

//如果buffer返回值為false並且已經握手的話 則斷開連接

if(!$buffer $is_shaked){

disconnect($socket);

}else{

//如果沒有握手的話則握手 並且修改握手狀態

if($is_shaked == false){

$return_str = dohandshake($buffer);

$is_shaked = true;

}else{

//如果已經握手的話則送入deal函數中進行相應處理

$data_str = decode($buffer); //解析出來的從前端送來的內容

console($data_str);

$return_str = encode(deal($socket, $data_str));

//$return_str = encode($data_str);

}

//將應該返回的字符串寫入socket返回

socket_write($socket,$return_str,strlen($return_str));

}

}

function deal($socket, $msgObj){

$obj = json_decode($msgObj);

foreach($obj as $key=$value){

if($key == ‘close’){

disconnect($socket);

console(‘close success’);

return ‘close success’;

}else if($key == ‘msg’){

console($value.”\n”);

return $value;

}

}

}

//獲取頭部信息

function getheaders($req){

$r=$h=$o=null;

if(preg_match(“/GET (.*) HTTP/” ,$req,$match)){ $r=$match[1]; }

if(preg_match(“/Host: (.*)\r\n/” ,$req,$match)){ $h=$match[1]; }

if(preg_match(“/Origin: (.*)\r\n/”,$req,$match)){ $o=$match[1]; }

if(preg_match(“/Sec-WebSocket-Key: (.*)\r\n/”,$req,$match)){ $key=$match[1]; }

if(preg_match(“/\r\n(.*?)\$/”,$req,$match)){ $data=$match[1]; }

return array($r,$h,$o,$key,$data);

}

function WebSocket($address,$port){

$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die(“socket_create() failed”);

socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die(“socket_option() failed”);

socket_bind($master, $address, $port) or die(“socket_bind() failed”);

socket_listen($master,20) or die(“socket_listen() failed”);

echo “Server Started : “.date(‘Y-m-d H:i:s’).”\n”;

echo “Master socket : “.$master.”\n”;

echo “Listening on : “.$address.” port “.$port.”\n\n”;

return $master;

}

function dohandshake($buffer){

list($resource,$host,$origin,$key,$data) = getheaders($buffer);

echo “resource is $resource\n”;

echo “origin is $origin\n”;

echo “host is $host\n”;

echo “key is $key\n\n”;

$response_key = base64_encode(sha1($key.’258EAFA5-E914-47DA-95CA-C5AB0DC85B11′, true));

$return_str = “HTTP/1.1 101 Switching Protocols\r\n”.

“Upgrade: websocket\r\n”.

“Connection: Upgrade\r\n”.

“Sec-WebSocket-Accept: $response_key\r\n\r\n”;

return $return_str;

}

function console($msg){

$msg = transToGBK($msg);

echo “$msg\n”;

return $msg;

}

function decode($msg=””) {

$mask = array();

$data = “”;

$msg = unpack(“H*”,$msg);

$head = substr($msg[1],0,2);

if (hexdec($head{1}) === 8){

$data = false;

} else if (hexdec($head{1}) === 1){

$mask[] = hexdec(substr($msg[1],4,2));

$mask[] = hexdec(substr($msg[1],6,2));

$mask[] = hexdec(substr($msg[1],8,2));

$mask[] = hexdec(substr($msg[1],10,2));

$s = 12;

$e = strlen($msg[1])-2;

$n = 0;

for ($i= $s; $i= $e; $i+= 2){

$data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));

$n++;

}

}

return $data;

}

function encode($msg=””){

$frame = array();

$frame[0] = “81”;

$msg .= ‘ is ok’;

$len = strlen($msg);

$frame[1] = $len16?”0″.dechex($len):dechex($len);

$frame[2] = ord_hex($msg);

$data = implode(“”,$frame);

return pack(“H*”, $data);

}

function transToGBK($s){//UTF8-GBK

//echo $s;

return iconv(“UTF-8”, “GBK”, $s);

return $s;

}

function ord_hex($data){

$msg = “”;

$l = strlen($data);

for ($i=0; $i$l; $i++){

//ord是返回字符串第一個字符的ascii值

//dechex把十進制轉換為十六進制

$msg .= dechex(ord($data{$i}));

}

return $msg;

}

function disconnect($socket){

global $is_shaked, $is_closed;

$is_shaked = false;

$is_closed = true;

socket_close($socket);

}

?

JAVASCRIPT 如何實現socket,

目前只有支持HTML5的瀏覽器加入了Javascript對Socket的支持, 而且目前處於測試階段, 還不推薦使用. 如果你必須要用Javascript實現socket傳輸, 相關代碼如下:

!– 初始化 —

function connect(){

try{

var socket;

var host = “ws://localhost:8000/socket/server/startDaemon.php”;

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(‘pError’+exception);

}

}

!– 發送數據 —

function send() {

socket.send(text);

}

!– 斷開Socket —

socket.close()

前台h5 Socket.Io.js做客戶端,服務器用Tomcat,java後台怎麼實現通訊。也是用socketio嗎?上詳細代碼。

socket.io封裝了websocket,同時包含了其它的連接方式,比如Ajax。原因在於不是所有的瀏覽器都支持websocket,通過socket.io的封裝,你不用關心裏面用了什麼連接方式。

你在任何瀏覽器里都可以使用socket.io來建立異步的連接。socket.io包含了服務端和客戶端的庫,如果在瀏覽器中使用了socket.io的js,服務端也必須同樣適用。如果你很清楚你需要的就是websocket,那可以直接使用websocket

原創文章,作者:UUPP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140213.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UUPP的頭像UUPP
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

發表回復

登錄後才能評論