光头强比你强 發表於 2025-8-31 13:42:41

使用PowerShell监听本地端口的多种方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">概述</a></li><li><a href="#_label1">方法一:使用System.Net.Sockets.TcpListener</a></li><li><a href="#_label2">方法二:创建简单的HTTP服务器</a></li><li><a href="#_label3">方法三:使用Socket类实现低级监听</a></li><li><a href="#_label4">方法四:使用PowerShell作业在后台监听</a></li><li><a href="#_label5">安全注意事项</a></li><li><a href="#_label6">测试监听器</a></li><li><a href="#_label7">总结</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>概述</h2>
<p>PowerShell提供了强大的网络功能,可以通过.NET类库实现本地端口的监听。这种功能常用于创建简单的网络服务、测试连接或进行网络调试。以下将介绍几种使用PowerShell监听本地端口的方法。</p>
<p class="maodian"><a name="_label1"></a></p><h2>方法一:使用System.Net.Sockets.TcpListener</h2>
<p>这是最直接的方法,使用.NET的TcpListener类来监听指定端口。</p>
<div class="jb51code"><pre class="brush:bash;"># 指定监听端口
$port = 8080

# 创建TcpListener对象
$listener = ::new(::Any, $port)

try {
    # 开始监听
    $listener.Start()
    Write-Host "正在监听端口 $port ... 按Ctrl+C停止"

    while ($true) {
      # 等待客户端连接(阻塞调用)
      $client = $listener.AcceptTcpClient()
      Write-Host "接收到来自 $($client.Client.RemoteEndPoint) 的连接"
      
      # 获取网络流
      $stream = $client.GetStream()
      $reader = New-Object System.IO.StreamReader($stream)
      $writer = New-Object System.IO.StreamWriter($stream)
      $writer.AutoFlush = $true
      
      # 读取客户端发送的数据
      $request = $reader.ReadLine()
      Write-Host "收到数据: $request"
      
      # 发送响应
      $response = "HTTP/1.1 200 OK`r`nContent-Type: text/plain`r`n`r`nPowerShell服务器已接收: $request"
      $writer.WriteLine($response)
      
      # 关闭连接
      $client.Close()
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    # 停止监听
    $listener.Stop()
    Write-Host "已停止监听"
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>方法二:创建简单的HTTP服务器</h2>
<p>以下示例创建一个简单的HTTP服务器,能够处理基本的GET请求:</p>
<div class="jb51code"><pre class="brush:bash;"># 创建简单的HTTP服务器
$port = 8080
$http = ::new()

# 设置监听URL
$http.Prefixes.Add("http://localhost:$port/")
$http.Prefixes.Add("http://127.0.0.1:$port/")

try {
    $http.Start()
    Write-Host "HTTP服务器正在运行,访问: http://localhost:$port/"
   
    while ($http.IsListening) {
      # 等待请求
      $context = $http.GetContext()
      
      # 处理请求
      $request = $context.Request
      $response = $context.Response
      
      Write-Host "$($request.RemoteEndPoint) $($request.HttpMethod) $($request.Url)"
      
      # 准备响应内容
      $buffer = ::UTF8.GetBytes("
            &lt;html&gt;
                &lt;body&gt;
                  &lt;h1&gt;PowerShell HTTP服务器&lt;/h1&gt;
                  &lt;p&gt;当前时间: $(Get-Date)&lt;/p&gt;
                  &lt;p&gt;请求URL: $($request.Url)&lt;/p&gt;
                  &lt;p&gt;客户端: $($request.RemoteEndPoint)&lt;/p&gt;
                &lt;/body&gt;
            &lt;/html&gt;
      ")
      
      # 发送响应
      $response.ContentLength64 = $buffer.Length
      $response.OutputStream.Write($buffer, 0, $buffer.Length)
      $response.Close()
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    $http.Stop()
    $http.Close()
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>方法三:使用Socket类实现低级监听</h2>
<p>对于需要更精细控制的情况,可以使用Socket类:</p>
<div class="jb51code"><pre class="brush:bash;"># 使用Socket类监听端口
$port = 8080
$endpoint = New-Object System.Net.IPEndPoint(::Any, $port)
$socket = New-Object System.Net.Sockets.Socket(
    ::InterNetwork,
    ::Stream,
    ::Tcp
)

try {
    $socket.Bind($endpoint)
    $socket.Listen(10) # 设置挂起连接队列的最大长度
    Write-Host "Socket正在监听端口 $port"
   
    while ($true) {
      # 接受连接
      $client = $socket.Accept()
      Write-Host "接收到来自 $($client.RemoteEndPoint) 的连接"
      
      # 接收数据
      $buffer = New-Object byte[] 1024
      $bytesRead = $client.Receive($buffer)
      $receivedData = ::ASCII.GetString($buffer, 0, $bytesRead)
      Write-Host "收到数据: $receivedData"
      
      # 发送响应
      $response = "PowerShell服务器已收到你的消息: $receivedData"
      $client.Send(::ASCII.GetBytes($response))
      
      # 关闭连接
      $client.Close()
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    $socket.Close()
}
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>方法四:使用PowerShell作业在后台监听</h2>
<p>如果需要长时间运行监听器,可以将其作为后台作业运行:</p>
<div class="jb51code"><pre class="brush:bash;"># 创建监听作业
$scriptBlock = {
    param($port)
    $listener = ::new(::Any, $port)
    $listener.Start()
   
    while ($true) {
      $client = $listener.AcceptTcpClient()
      $stream = $client.GetStream()
      $reader = New-Object System.IO.StreamReader($stream)
      $request = $reader.ReadLine()
      Write-Host "收到: $request"
      $client.Close()
    }
}

# 启动后台作业
$job = Start-Job -ScriptBlock $scriptBlock -ArgumentList 8080
Write-Host "监听作业已启动,ID: $($job.Id)"

# 要停止作业,可以使用: Stop-Job -Id $job.Id; Remove-Job -Id $job.Id
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>安全注意事项</h2>
<ol><li><strong>防火墙配置</strong>: 确保Windows防火墙允许通过指定端口的通信</li><li><strong>权限要求</strong>: 监听1024以下的端口需要管理员权限</li><li><strong>网络安全</strong>: 在生产环境中使用时应考虑加密通信(如TLS/SSL)</li><li><strong>资源管理</strong>: 长时间运行的监听器应包含适当的错误处理和资源清理</li></ol>
<p class="maodian"><a name="_label6"></a></p><h2>测试监听器</h2>
<p>可以使用以下方法测试监听器是否正常工作:</p>
<ul><li>使用Web浏览器访问 <code>http://localhost:端口号</code></li><li>使用Telnet客户端:</li></ul>
<div class="jb51code"><pre class="brush:bash;">telnet localhost 端口号
</pre></div>
<ul><li>使用PowerShell发送测试请求:</li></ul>
<div class="jb51code"><pre class="brush:bash;">Invoke-WebRequest -Uri "http://localhost:端口号"
</pre></div>
<p class="maodian"><a name="_label7"></a></p><h2>总结</h2>
<p>PowerShell提供了多种方法来监听本地端口,从简单的TCP监听器到完整的HTTP服务器。选择合适的方法取决于具体需求,如协议复杂度、性能要求和安全考虑。无论选择哪种方法,都应确保适当处理错误和资源清理,以保证稳定性和安全性。</p>
<p><strong>注意</strong>: 在生产环境中使用这些技术前,请确保符合组织的安全政策和法律法规要求。</p>
頁: [1]
查看完整版本: 使用PowerShell监听本地端口的多种方法