Skocz do zawartości
gromek97

JavaScript/Node.JS

Polecane posty

Cześć, czy pomoże mi ktoś przerobić ten kod z php na javascript?
<?php
/*
shard_status.php
v1.0


This is an example of how to get the status of a UO emulator (RunUO, ServUO, Sphere, etc.)
by sending a packet to the shard address:port.


\x7f\x00\x00\x01\xf1\x00\x04\xff


Newer ServUO Shards will return something like this:
Array ( [0] => ServUO [1] => Name=My Shard [2] => Age=3 [3] => Clients=1 [4] => Items=112187 [5] => Chars=2934 [6] => Mem=217514K [7] => Ver=2 )


RunUO and Sphere Shards don't return version:
Array ( [0] => ServUO [1] => Name=My Shard [2] => Age=3 [3] => Clients=1 [4] => Items=112187 [5] => Chars=2934 [6] => Mem=217514K )


2016 - Ixtabay for www.RunUO.com
*/




$shard_addr ="login.uodemise.com";
$shard_port ="2593";


$fp = fsockopen($shard_addr, $shard_port);


if (!$fp) {
    echo "Cannot connect to $shard_addr:$shard_port\n";
} else {


    fwrite($fp, "\x7f\x00\x00\x01\xf1\x00\x04\xff");
    stream_set_timeout($fp, 2);
    $res = fread($fp, 2000);


    $info = stream_get_meta_data($fp);
    fclose($fp);


    if ($info['timed_out']) {
        echo 'Connection to to $shard_addr:$shard_port timed out!';
    } else {


    $ver = '';


    $arr = explode(',', $res);
// print_r($arr); // Uncomment if you want to see the raw array
   
$emu     = $arr[0];
$name    = ltrim(strstr($arr[1],'='), '=');
$age     = ltrim(strstr($arr[2], '='), '=');
$clients = ltrim(strstr($arr[3], '='), '=');
$items   = ltrim(strstr($arr[4], '='), '=');
$mobs    = ltrim(strstr($arr[5], '='), '=');
$mem     = ltrim(strstr($arr[6], '='), '=');


if ($emu <> "ServUO") $ver = "Unknown"; // Only ServUO Shards return version
else $ver = ltrim(strstr($arr[07], '='), '=');




// Example usage
echo <<<EOF
<style type="text/css">
table tr th,
table tr td {
    border-right: none;
    border-bottom: none;
    cell-padding-left: 2px;
    min-width: 100px;  
}
th {
    text-align:right;
}
</style>


<table>
    <tr>
        <th>Status:</th>
        <td>Online</td>
    </tr>
    <tr>
        <th>Emu:</th>
        <td>$emu</td>
    </tr>
    <tr>
        <th>Name:</th>
        <td>$name</td>
    </tr>
    <tr>
        <th>Uptime:</th>
        <td>$age hours</td>
    </tr>
    <tr>
        <th>Players Online:</th>
        <td>$clients</td>
    </tr>
    <tr>
        <th>Total Items:</th>
        <td>$items</td>
    </tr>
    <tr>
        <th>Mobs:</th>
        <td>$mobs</td>
    </tr>
    <tr>
        <th>Memory Used:</th>
        <td>$mem</td>
    </tr>  
    <tr>
        <th>Version:</th>
        <td>$ver</td>
    </tr>      
</table>


EOF;


       
       
    }


}






?>

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

  1. Nawiązujesz połączenie z hostem o podanym adresie na określonym porcie

Wysyłasz do hosta dane "\x7f\x00\x00\x01\xf1\x00\x04\xff"

Ustawiasz limit czasu na odpowiedź

Odczytujesz odpowiedź od hosta przy czym oczekujesz odpowiedzi o maksymalnej długości 2000 byteów

Zamykasz połączenie

Otrzymane dane dzielisz po przecinku na poszczególne elementy tablicy

Poszczególne elementy tablicy przypisujesz do zmiennych; wcześniej odnajdując znak "=" i usuwając wszystko do tego znaku włącznie z danego elementu tablicy

Wyświetlasz dane

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

 

Cześć, czy pomoże mi ktoś przerobić ten kod z php na javascript?
$fp = fsockopen($shard_addr, $shard_port);


fwrite($fp, "\x7f\x00\x00\x01\xf1\x00\x04\xff");
    stream_set_timeout($fp, 2);
    $res = fread($fp, 2000);


    $info = stream_get_meta_data($fp);
    fclose($fp);

 

 

 

Przedmiotowy skrypt realizuje obsługę socketów w tym wypadku w PHP.

Jak widzisz lub i nie masz tam:

- nawiązanie połączenia

- wysłanie danych do gniazda

- odczytanie z gniazda

- zamkniecie połączenia

- obróbka danych.

 

Do operacji na socketach (gniazdach) w node masz bibliotekę lub komponent jak zwal tak zwal "net"

Wiec musisz wykonać podobnie https://nodejs.org/api/net.html

 

Rożnica jest taka, ze w tym wypadku PHP działa w trybie synchronicznym przepływ działa liniowo tak jak masz w kodzie natomiast NODE.js w sposób asynchroniczny, wiec opiera sie na wywołaniach zwrotnych "calback".

 

 

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zrobiłem coś takiego tylko dostaje zero odpowiedzi

 

const net = require('net');
const client = net.connect({host: '81.2.247.112', port: 8124}, () => {
  // 'connect' listener
  console.log('connected to server!');
  client.write('\x7f\x00\x00\x01\xf1\x00\x04\xff');
});
client.on('data', (data) => {
  console.log(data);
  client.end();
});
client.on('end', () => {
  console.log('disconnected from server');
});

 

Edytowano przez gromek97 (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
const net = require('net');
const client = net.connect({host: 'login.uodemise.com', port: 2593}, () => {
  // 'connect' listener
  console.log('connected to server!');

  let buf = Buffer.from([0x7F, 0x00, 0x00, 0x01, 0xF1, 0x00, 0x04, 0xFF]);
  client.write(buf);
});

client.on('data', (data) => {
  console.log(data.toString('utf8'));
  client.end();
});

client.on('end', () => {
  console.log('disconnected from server');
});
connected to server!
RunUO, Name=Demise - AOS, Age=8, Clients=345, Items=9624249, Chars=207449, Mem=10661523K, Ver=2 

edit dla ciekawskich:

Buffer([0x7F, 0x00, 0x00, 0x01, 0xF1, 0x00, 0x04, 0xFF]) -> <Buffer 7f 00 00 01 f1 00 04 ff>
Buffer('\x7F\x00\x00\x01\xF1\x00\x04\xFF') -> <Buffer 7f 00 00 01 c3 b1 00 04 c3 bf>
Buffer('\x7F\x00\x00\x01\xF1\x00\x04\xFF', 'latin1') -> <Buffer 7f 00 00 01 f1 00 04 ff>

W dokumentacji JS jest napisane, że notacją \xXX escapujemy znaki latin1

Edytowano przez kbck (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×