VB.Net里130行代码实现的HTTP文件服务器如何优化?

2026-05-06 11:572阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计737个文字,预计阅读时间需要3分钟。

VB.Net里130行代码实现的HTTP文件服务器如何优化?

两周前,我发现了一篇非常有趣的文章:《A HTTP file server in 130 lines of code》。我在Visual Basic中翻译了原始代码(我使用的是Visual Basic Net 2005 Express)。以下是翻译后的代码片段:

vbImports SystemImports System.IOImports System.Net

Module Module1 Sub Main() ' 代码内容 End SubEnd Module

两周前我发现了一篇非常有趣的文章: “A HTTP file server in 130 lines of code”.我在Visual Basic中翻译了原始代码(我使用的是Visual Basic Net 2005 Express).

Imports System Imports System.IO Imports System.Net Imports System.Text Imports System.Web Public Class HttpFileServer Implements IDisposable Public rootPath As String Private Const bufferSize As Integer = 1024 * 512 '512KB Private ReadOnly localhost:80/") http.Start() http.BeginGetContext(requestWait, Nothing) End Sub Public Sub Dispose() Implements System.IDisposable.Dispose http.[Stop]() End Sub Private Sub requestWait(ByVal ar As IAsyncResult) If Not http.IsListening Then Return End If Dim c = http.EndGetContext(ar) http.BeginGetContext(requestWait, Nothing) Dim url = tuneUrl(c.Request.RawUrl) Dim fullPath = IIf(String.IsNullOrEmpty(url), rootPath, Path.Combine(rootPath, url)) If Directory.Exists(fullPath) Then returnDirContents(c, fullPath) ElseIf File.Exists(fullPath) Then returnFile(c, fullPath) Else return404(c) End If End Sub Private Sub returnDirContents(ByVal context As HttpListenerContext, ByVal dirPath As String) context.Response.ContentType = "text/html" context.Response.ContentEncoding = Encoding.UTF8 Using sw = New StreamWriter(context.Response.OutputStream) sw.WriteLine("html") sw.WriteLine("head meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8""/head") sw.WriteLine("body ul") Dim dirs = Directory.GetDirectories(dirPath) For Each d As Object In dirs Dim link = d.Replace(rootPath, "").Replace("\"c, "/"c) sw.WriteLine("<li>&lt;DIR&gt; a href=""" + link + """ " + Path.GetFileName(d) + "/a /li ") Next Dim files = Directory.GetFiles(dirPath) For Each f As Object In files Dim link = f.Replace(rootPath, "").Replace("\"c, "/"c) sw.WriteLine(" li <a href=""" + link + """ " + Path.GetFileName(f) + " /a /li ") Next sw.WriteLine(" /ul /body /html ") End Using context.Response.OutputStream.Close() End Sub Private Shared Sub returnFile(ByVal context As HttpListenerContext, ByVal filePath As String) context.Response.ContentType = getcontentType(Path.GetExtension(filePath)) Dim buffer = New Byte(bufferSize - 1) {} Using fs = File.OpenRead(filePath) context.Response.ContentLength64 = fs.Length Dim read As Integer While (InlineAssignHelper(read, fs.Read(buffer, 0, buffer.Length))) > 0 context.Response.OutputStream.Write(buffer, 0, read) End While End Using context.Response.OutputStream.Close() End Sub Private Shared Sub return404(ByVal context As HttpListenerContext) context.Response.StatusCode = 404 context.Response.Close() End Sub Private Shared Function tuneUrl(ByVal url As String) As String url = url.Replace("/"c, "\"c) url = HttpUtility.UrlDecode(url, Encoding.UTF8) url = url.Substring(1) Return url End Function Private Shared Function getcontentType(ByVal extension As String) As String Select Case extension Case ".avi" Return "video/x-msvideo" Case ".css" Return "text/css" Case ".doc" Return "application/msword" Case ".gif" Return "image/gif" Case ".htm", ".html" Return "text/html" Case ".jpg", ".jpeg" Return "image/jpeg" Case ".js" Return "application/x-javascript" Case ".mp3" Return "audio/mpeg" Case ".png" Return "image/png" Case ".pdf" Return "application/pdf" Case ".ppt" Return "application/vnd.ms-powerpoint" Case ".zip" Return "application/zip" Case ".txt" Return "text/plain" Case Else Return "application/octet-stream" End Select End Function Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T target = value Return value End Function End Class

但我得到了错误:

Error 1 Argument not specified for parameter ‘ar’ of ‘Private Sub requestWait(ar As System.IAsyncResult)’. line 19
Error 2 Argument not specified for parameter ‘ar’ of ‘Private Sub requestWait(ar As System.IAsyncResult)’. line 31

这两个错误都引用了表达式http.BeginGetContext(requestWait,Nothing).但我不知道如何处理这个问题.

要编译代码,请更改行

VB.Net里130行代码实现的HTTP文件服务器如何优化?

http.BeginGetContext(requestWait, Nothing)

http.BeginGetContext(AddressOf requestWait, Nothing)

你可以看看AddressOf Operator和this question.

本文共计737个文字,预计阅读时间需要3分钟。

VB.Net里130行代码实现的HTTP文件服务器如何优化?

两周前,我发现了一篇非常有趣的文章:《A HTTP file server in 130 lines of code》。我在Visual Basic中翻译了原始代码(我使用的是Visual Basic Net 2005 Express)。以下是翻译后的代码片段:

vbImports SystemImports System.IOImports System.Net

Module Module1 Sub Main() ' 代码内容 End SubEnd Module

两周前我发现了一篇非常有趣的文章: “A HTTP file server in 130 lines of code”.我在Visual Basic中翻译了原始代码(我使用的是Visual Basic Net 2005 Express).

Imports System Imports System.IO Imports System.Net Imports System.Text Imports System.Web Public Class HttpFileServer Implements IDisposable Public rootPath As String Private Const bufferSize As Integer = 1024 * 512 '512KB Private ReadOnly localhost:80/") http.Start() http.BeginGetContext(requestWait, Nothing) End Sub Public Sub Dispose() Implements System.IDisposable.Dispose http.[Stop]() End Sub Private Sub requestWait(ByVal ar As IAsyncResult) If Not http.IsListening Then Return End If Dim c = http.EndGetContext(ar) http.BeginGetContext(requestWait, Nothing) Dim url = tuneUrl(c.Request.RawUrl) Dim fullPath = IIf(String.IsNullOrEmpty(url), rootPath, Path.Combine(rootPath, url)) If Directory.Exists(fullPath) Then returnDirContents(c, fullPath) ElseIf File.Exists(fullPath) Then returnFile(c, fullPath) Else return404(c) End If End Sub Private Sub returnDirContents(ByVal context As HttpListenerContext, ByVal dirPath As String) context.Response.ContentType = "text/html" context.Response.ContentEncoding = Encoding.UTF8 Using sw = New StreamWriter(context.Response.OutputStream) sw.WriteLine("html") sw.WriteLine("head meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8""/head") sw.WriteLine("body ul") Dim dirs = Directory.GetDirectories(dirPath) For Each d As Object In dirs Dim link = d.Replace(rootPath, "").Replace("\"c, "/"c) sw.WriteLine("<li>&lt;DIR&gt; a href=""" + link + """ " + Path.GetFileName(d) + "/a /li ") Next Dim files = Directory.GetFiles(dirPath) For Each f As Object In files Dim link = f.Replace(rootPath, "").Replace("\"c, "/"c) sw.WriteLine(" li <a href=""" + link + """ " + Path.GetFileName(f) + " /a /li ") Next sw.WriteLine(" /ul /body /html ") End Using context.Response.OutputStream.Close() End Sub Private Shared Sub returnFile(ByVal context As HttpListenerContext, ByVal filePath As String) context.Response.ContentType = getcontentType(Path.GetExtension(filePath)) Dim buffer = New Byte(bufferSize - 1) {} Using fs = File.OpenRead(filePath) context.Response.ContentLength64 = fs.Length Dim read As Integer While (InlineAssignHelper(read, fs.Read(buffer, 0, buffer.Length))) > 0 context.Response.OutputStream.Write(buffer, 0, read) End While End Using context.Response.OutputStream.Close() End Sub Private Shared Sub return404(ByVal context As HttpListenerContext) context.Response.StatusCode = 404 context.Response.Close() End Sub Private Shared Function tuneUrl(ByVal url As String) As String url = url.Replace("/"c, "\"c) url = HttpUtility.UrlDecode(url, Encoding.UTF8) url = url.Substring(1) Return url End Function Private Shared Function getcontentType(ByVal extension As String) As String Select Case extension Case ".avi" Return "video/x-msvideo" Case ".css" Return "text/css" Case ".doc" Return "application/msword" Case ".gif" Return "image/gif" Case ".htm", ".html" Return "text/html" Case ".jpg", ".jpeg" Return "image/jpeg" Case ".js" Return "application/x-javascript" Case ".mp3" Return "audio/mpeg" Case ".png" Return "image/png" Case ".pdf" Return "application/pdf" Case ".ppt" Return "application/vnd.ms-powerpoint" Case ".zip" Return "application/zip" Case ".txt" Return "text/plain" Case Else Return "application/octet-stream" End Select End Function Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T target = value Return value End Function End Class

但我得到了错误:

Error 1 Argument not specified for parameter ‘ar’ of ‘Private Sub requestWait(ar As System.IAsyncResult)’. line 19
Error 2 Argument not specified for parameter ‘ar’ of ‘Private Sub requestWait(ar As System.IAsyncResult)’. line 31

这两个错误都引用了表达式http.BeginGetContext(requestWait,Nothing).但我不知道如何处理这个问题.

要编译代码,请更改行

VB.Net里130行代码实现的HTTP文件服务器如何优化?

http.BeginGetContext(requestWait, Nothing)

http.BeginGetContext(AddressOf requestWait, Nothing)

你可以看看AddressOf Operator和this question.