C# 通过互联网发送小数据串(30~40字节)的最便宜方式?

C# 通过互联网发送小数据串(30~40字节)的最便宜方式?,c#,sockets,C#,Sockets,我需要每分钟左右从大约100部安卓手机向某种服务器发送一个小字符串o数据。问题是,我使用的每个MB大约是1.5美元,因此如果数据太大,成本会大大增加 我尝试过使用post,但它在发送的每个字符串中使用了400字节的数据。我曾尝试制作一个C#socket服务器,客户端在其中连接、发送数据和断开连接,但它仍然使用400字节的数据,也许更多一些……这怎么可能?netbalancer是否测量错误?我在c#中使用了client.Send(“字符串”) 如果我使用移动数据手机,会有什么不同吗?我在局域网的另

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

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

如果我使用移动数据手机,会有什么不同吗?我在局域网的另一台笔记本电脑上做这件事

我也尝试过ftp,它也太臃肿了

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

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

下面是在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连接,因为这样可以减少协议开销
  • 发明一种检测数据包丢失并允许重新查询数据包的最小协议

    一个想法:

    为每个数据包添加一个序列号。保持在发送方发送的数据包数最少。允许发送方从接收方接收应答。让接收方发送请求,要求发送方重新发送丢失的任何序列号

    这将允许填补空白,这些空白是在由发送方保留的数据包数量定义的时间窗口内引入的

    对于序列号,每个数据包增加一个字节就可以了,两个字节就足够了。但是,最大序列号(及其大小)取决于发送方作为历史记录保存的最大数据包数,以便能够重新发送它们


我以前从未听说过,我现在只是在读有关它的书。你能像管道一样将它连接到android进程或服务吗?我可以完全访问手机,其他人不会使用。如果数据的大小相同,那么问题就出在数据的大小上。你能给我们看一些数据例子吗?发帖将发送字段名以及字段数据和套接字都很好,但是在发送之前如何序列化数据?有时,位置格式是一种方法,即对于表示名称| candy | meat的流,您将发送harry | fudge | pork,这样您就不会发送字段名,而只需采用给定的格式/协议。除此之外,压缩可能会进一步减少有效负载的大小。。。或者根据数据实际增加它;如果您可以完全控制整个过程,您可以简单地假设格式正确,并尽可能少地发送数据。例如,它绝对必须是字符串吗?也许不完全是你想要的,但是,这里有一个C#effective socket的搜索:它可能会给你一些想法。为什么每一分钟?最终,数据将开始为您的消费者积累。可能需要一些时间,但据我所知,.net默认使用Unicode字符串。这是一个x2字节,仅此而已。
<?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);
?>