:)
我正在尝试从我的php服务器中的c#实时应用程序接收数据,然后根据数据在浏览器中移动图片。
数据发送和接收没有问题,但运行代码时,chrome的内存使用量越来越多。
如果我在while循环中关闭套接字,性能会变得非常低但是mem使用率正常。所以这是关于打开的套接字......
这是php代码:
<?php
//http://www.binarytides.com/udp-socket-programming-in-php/
//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if( !socket_bind($sock, "0.0.0.0" , 41181) )
{
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
//Do some communication, this loop can handle multiple clients
while(1)
{
//echo "Waiting for data ... \n";
$r = socket_recvfrom($sock, $buf, 20, 0, $remote_ip, $remote_port);
?>
<script type="text/javascript">
var data = "<?php echo $buf ?>";
</script>
<?php
}
socket_close($sock);
?>
这里是c#函数(数据发送者):
public static void SendUDP(string hostNameOrAddress, int destinationPort, string data, int count)
{
//class member : Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
//socket is defined as class member and used here
for (int i = 0; i < count; i++)
{
socket.SendTo(buffer, endPoint);
}
}
谢谢! :)
答案 0 :(得分:0)
您正在使用的技术称为“长轮询”。这是一种模仿双向通信的有趣方式,特别是对于旧浏览器,但有其缺点。
问题是,随着时间的推移,您向浏览器发送了大量的有效负载。
当您不断写入浏览器时,页面大小会增加,并且随之增加DOM树。所有这些都必须存储在内存中。我假设当你只发送一些脚本块时,性能仍然可以。但是成千上万的人当然会吃掉你的记忆。
此外,如果您使用的是诊断工具,例如Firefox中的Chrome开发者工具或Firebug,它们会存储大量调试信息,这些信息也会占用大量内存。 (尝试禁用它们。)
如果您为了娱乐和实验而编写此代码,则不必担心内存消耗;这是长期民意调查所固有的。
但是,如果您正在尝试使用真正的双向通信编写Web应用程序,则应使用Web套接字(可能与服务器端的PHP语言不同)。
答案 1 :(得分:0)
这不是我的问题的真实答案,但我的经验可能对某人有帮助。
我不能用PHP服务器进行“长轮询”,这是PHP的错,而不是浏览器。 我使用Node.js服务器以这种方式开发了一个很好的应用程序。
我的C#app用于处理来自相机的图像。导致图像处理的实时数据被发送到Node.js服务器并从服务器发送到浏览器。
现在我使用网络技术开发一个在.Net中很难实现的图形用户界面,它还有许多其他好处......