我遇到了UWP问题。我试图绑定一个StreamSocketListener作为一个小型Web服务器,但在20个左右的连接后,ReadAsync函数挂起,应用程序最终关闭而没有错误。
以下是我正在使用的代码:
private const uint bufferSize = 1024;
private int port = 9000;
public async void Start()
{
StreamSocketListener listener = new StreamSocketListener();
listener.ConnectionReceived += async (sender, args) =>
{
string request = null;
using (IInputStream input = args.Socket.InputStream)
{
byte[] data = new byte[bufferSize];
IBuffer buffer = data.AsBuffer();
uint bytesRead = bufferSize;
while (bytesRead == bufferSize)
{
IBuffer result = await input.ReadAsync(buffer, bufferSize, InputStreamOptions.Partial);
request += Encoding.ASCII.GetString(result.ToArray());
bytesRead = buffer.Length;
}
processRequest(getPath(request), args.Socket.OutputStream);
}
};
await listener.BindServiceNameAsync(port.ToString());
}
答案 0 :(得分:0)
您最好及时处理废弃的连接。当您的应用收到新连接时,您可以在其ConnectionReceived事件处理程序中释放先前的连接。您可以看到官方代码示例也做同样的事情。 SocketActivityStreamSocket/cs/Server
答案 1 :(得分:0)
我在我的Raspberry Pi 3上使用类似的代码(我在网上找到它)作为一个简单的Web服务器,是的..它非常沮丧。实际上,我遇到了同样的问题,我在每个请求上都使用了“args.Socket.Dispose()”来解决问题的一部分。
我有一个Windows服务客户端每隔30秒连接到我的Pi简单Web服务器,我的Pi后台服务在大约1.5到2小时后挂起。经过多个小时的调试后,我尝试从input.ReadSync中删除“await”,同时确保您的ProcessRequest不执行任何异步/等待。它解决了我的问题,服务器变得稳定而不会挂起。对我来说没关系,因为我只有一个客户端,所以Sync或Async对我来说并不重要。
虽然有一个奇怪的问题......它似乎在白天随机,“请求”字符串将收到一些垃圾,而不是真正的HTTP请求。我还是没弄明白为什么。 BTW,在GitHub上有一个非常好的开源项目名为“Catnap.Server”,看起来看起来非常强大。我没有尝试过,但是如果你看一下这个实现,他们就会使用Streamreader而不是ReadAsync。
当我的Windows服务客户端连接到我在旧版本的Raspberry Pi上运行时,它已经运行了3年,该版本运行在NOOBS linux,Apache和PHP上。它坚如磐石稳定......只想试试Win 10 IoT,我们必须实现自己的网络服务器!! ???到目前为止,我的经历并不是那么令人愉快。