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

时间:2015-02-22 12:41:24

标签: c# sockets

我需要每隔一分钟左右从100个左右的安卓手机发送小数据串数据到某种服务器。问题是我使用的每个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);
?>

1 个答案:

答案 0 :(得分:0)

  • 不发送字符串,发送二进制数据(最好以网络字节顺序)。以二进制格式发送信息可以减少有效负载的大小。
  • 转到UDP连接,因为这会减少协议开销。
  • 创建一个最小协议来检测数据包丢失并允许重新获取数据包。

    一个想法:

    为每个数据包添加序列号。保留发送方发送的最小数据包数。允许发件人从接收者接收答案。让接收方发送请求让发送方重新发送任何序列号丢失。

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

    对于序列号,每个数据包可能有一个附加字节,两个字节肯定就足够了。但是,最大序列号(以及它的大小)取决于发送者保存的历史数据包的最大数量,以便能够重新发送它们。