alexya-framework/sockswork

Alexya的SocksWork组件

3.0.1 2016-08-24 16:03 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:20:13 UTC


README

Alexya的SocksWork库

内容

SocksWork

\Alexya\SocksWork\SocksWork提供了一个简单的方式连接服务器并发送数据包。

构造函数接受服务器的主机、端口和连接超时作为参数。它还接受一个布尔参数,指示构造函数完成后SocksWork是否应该连接到服务器,默认设置为true。然而,如果您将其设置为false,则需要调用\Alexya\SocksWork\SocksWork::connect方法。

示例

<?php

$SocksWork = new SocksWork("localhost", 8080, 100); // Connects to localhost:8080 and sets a timeout of 100ms

一旦建立连接,您可以使用\Alexya\SocksWork\SocksWork::send命令发送任何东西,该命令接受要发送的二进制数据或\Alexya\SocksWork\PacketBuilder实例作为参数。

如果参数是二进制数据,则响应将设置为\Alexya\SocksWork\SocksWork::$response属性,如果是\Alexya\SocksWork\PacketBuilder实例,则响应将直接发送到其属性。

该方法还接受一个布尔参数,指示SocksWork是否应该等待响应。

示例

<?php

$SocksWork->send((binary) "Hello world!");
echo $SocksWork->response; // Response to the packet

$packet = new PacketBuilder();
$packet->writeString("message", "Hello World!");

$SocksWork->send($packet);

echo $packet->readString("response"); // Response to the packet

要关闭连接,只需调用方法\Alexya\SocksWork\SocksWork::close,当您想重新连接时,调用方法\Alexya\SocksWork\SocksWork::connect,要检查SocksWork是否已连接,请使用方法\Alexya\SocksWork\SocksWork::isConnected

PacketBuilder

\Alexya\SocksWork\PacketBuilder提供了一个接口来构建将要通过\Alexya\SocksWork\SocksWork发送的数据包,它还提供了读取响应的方法。

构造函数接受一个类型为\Alexya\SocksWork\IEncoder的对象作为参数,该对象将是用于写入和读取数据包的编码器(默认情况下是一个\Alexya\SocksWork\Encoders\StringEncoder实例)。

一旦调用构造函数,您就可以通过实例对象调用编码器的各种方法来开始向数据包添加参数。

示例

<?php

$packet = new PacketBuilder();

$packet->writeShort("id", 1);
$packet->writeString("name", "test");

$SocksWork->send($packet);

$id   = $packet->readShort("id");
$name = $packet->readString("name");

您还可以扩展此类以简化对象的实例化

<?php

class SetUserName extends PacketBuilder
{
    private $_id = 1;

    public $id   = -1;
    public $name = "";

    public function onInstance(string $name)
    {
        $this->_encoder->writeShort("id", $this->_id);
        $this->_encoder->writeString("name", $name);
    }

    public function onResponse()
    {
        $this->id   = $this->_ecoder->readShort("id");
        $this->name = $this->_encoder->readString("name");
    }
}

$packet = new SetUserName("test");

$SocksWork->send($packet);

$id   = $packet->id;
$name = $packet->name;

方法\Alexya\SocksWork\PacketBuilder::onInstance在构造函数之后立即执行,并接收传递给构造函数的参数(不包括编码器实例)。

例如

<?php

class Packet extends PacketBuilder
{
    public function onInstance()
    {
        foreach(func_get_args() as $key => $val) {
            echo "{$key} => {$value}\n";
        }
    }
}

$packet = new Packet(1, "test", "foo");
// Output:
// 0 => 1
// 1 => test
// 2 => foo

$packet = new Packet(new \Alexya\SocksWork\Encoders\String(), 1, "test");
// Output:
// 0 => 1
// 1 => test

方法\Alexya\SocksWork\PacketBuilder::onResponse在接收到响应后立即执行。

编码器

编码器是将在SocksWork中发送数据的类,它们必须扩展类\Alexya\SocksWork\Encoder。您可以在命名空间\Alexya\SocksWork\Encoders中查看可用的编码器。