通过 Internet 发送小数据串(30~40 字节)的最便宜的方法?

Cheapest way to send small strings of data (30~40 bytes) over the internet?

我需要每分钟左右从 100 部左右 android 手机向某种服务器发送小串数据。问题是我使用的每个 MB 大约是 1.5 美元,所以如果数据量太大,成本会大大增加。

我试过使用 post,但它每个发送的字符串使用 400 字节的数据。我试图制作一个 C# 套接字服务器,客户端连接、发送数据和断开连接,但它仍然使用 400 字节的数据,也许更多……这怎么可能? netbalancer 会不会测量错了?我在 c# 中使用了 client.Send("string")。

如果我使用移动数据手机,会有什么不同吗?我正在对局域网中的另一台笔记本电脑执行此操作。

我也试过ftp也太臃肿了

我需要发送的每个字符串的网络消耗在 100-120 字节左右,这可能吗?我可以使用什么工具? ---更新---

这是 C# 客户端代码(如果我知道如何优化大小,将是 Java)

            // Read the first batch of the TcpServer response bytes.
        Int32 port = 10000;
        byte[] bytes = Encoding.ASCII.GetBytes("0001#37.12489#-106.35871");   
        TcpClient client = new TcpClient("192.168.15.16", port);

        int bytesSent = client.Client.Send(bytes);

        client.Close(); 

这是 XAMPP 上的 PHP 插座 运行。我可以用任何语言制作它,因为我可能不得不将它用作不允许套接字的服务器的中继。

<?php
error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();

$address = 'xxx.xxx.xx.xx';
$port = 10000;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)
{
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) 
{
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}
if (socket_listen($sock, 5) === false) 
{
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do 
{
    if (($msgsock = socket_accept($sock)) === false) 
    {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }

    $buf = socket_read($msgsock,50);
    socket_close($msgsock);

    echo "$buf\n";
} while (true);
socket_close($sock);
?>
  • 不发送字符串,发送二进制数据(最好按网络字节顺序)。以二进制格式发送信息可减少有效负载的大小。
  • 寻求 UDP 连接,因为这会减少协议开销。
  • 发明一个最小的协议来检测数据包丢失并允许重新请求数据包。

    一个想法:

    为每个数据包添加一个序列号。保持发送方发送的最小数据包数。允许发送者接收来自接收者的答案。让接收方发送请求,让发送方重新发送任何丢失的序列号。

    这将允许填补空白,这些空白是在 window 由发件人保留的数据包数量定义的时间内引入的。

    对于序列号,每个数据包可能需要一个额外的字节,两个字节肯定就足够了。然而,最大序列号(及其大小)取决于发送方作为历史记录能够重新发送它们的最大数据包数。