通过 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 由发件人保留的数据包数量定义的时间内引入的。
对于序列号,每个数据包可能需要一个额外的字节,两个字节肯定就足够了。然而,最大序列号(及其大小)取决于发送方作为历史记录能够重新发送它们的最大数据包数。
我需要每分钟左右从 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 由发件人保留的数据包数量定义的时间内引入的。
对于序列号,每个数据包可能需要一个额外的字节,两个字节肯定就足够了。然而,最大序列号(及其大小)取决于发送方作为历史记录能够重新发送它们的最大数据包数。