PowerShell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > PowerShell > PowerShell监听本地端口

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

作者:Bruce_xiaowei

PowerShell提供了强大的网络功能,可以通过.NET类库实现本地端口的监听,这种功能常用于创建简单的网络服务、测试连接或进行网络调试,以下将介绍几种使用PowerShell监听本地端口的方法,需要的朋友可以参考下

概述

PowerShell提供了强大的网络功能,可以通过.NET类库实现本地端口的监听。这种功能常用于创建简单的网络服务、测试连接或进行网络调试。以下将介绍几种使用PowerShell监听本地端口的方法。

方法一:使用System.Net.Sockets.TcpListener

这是最直接的方法,使用.NET的TcpListener类来监听指定端口。

# 指定监听端口
$port = 8080

# 创建TcpListener对象
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::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 "已停止监听"
}

方法二:创建简单的HTTP服务器

以下示例创建一个简单的HTTP服务器,能够处理基本的GET请求:

# 创建简单的HTTP服务器
$port = 8080
$http = [System.Net.HttpListener]::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 = [System.Text.Encoding]::UTF8.GetBytes("
            <html>
                <body>
                    <h1>PowerShell HTTP服务器</h1>
                    <p>当前时间: $(Get-Date)</p>
                    <p>请求URL: $($request.Url)</p>
                    <p>客户端: $($request.RemoteEndPoint)</p>
                </body>
            </html>
        ")
        
        # 发送响应
        $response.ContentLength64 = $buffer.Length
        $response.OutputStream.Write($buffer, 0, $buffer.Length)
        $response.Close()
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    $http.Stop()
    $http.Close()
}

方法三:使用Socket类实现低级监听

对于需要更精细控制的情况,可以使用Socket类:

# 使用Socket类监听端口
$port = 8080
$endpoint = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, $port)
$socket = New-Object System.Net.Sockets.Socket(
    [System.Net.Sockets.AddressFamily]::InterNetwork,
    [System.Net.Sockets.SocketType]::Stream,
    [System.Net.Sockets.ProtocolType]::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 = [System.Text.Encoding]::ASCII.GetString($buffer, 0, $bytesRead)
        Write-Host "收到数据: $receivedData"
        
        # 发送响应
        $response = "PowerShell服务器已收到你的消息: $receivedData"
        $client.Send([System.Text.Encoding]::ASCII.GetBytes($response))
        
        # 关闭连接
        $client.Close()
    }
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    $socket.Close()
}

方法四:使用PowerShell作业在后台监听

如果需要长时间运行监听器,可以将其作为后台作业运行:

# 创建监听作业
$scriptBlock = {
    param($port)
    $listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::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

安全注意事项

  1. 防火墙配置: 确保Windows防火墙允许通过指定端口的通信
  2. 权限要求: 监听1024以下的端口需要管理员权限
  3. 网络安全: 在生产环境中使用时应考虑加密通信(如TLS/SSL)
  4. 资源管理: 长时间运行的监听器应包含适当的错误处理和资源清理

测试监听器

可以使用以下方法测试监听器是否正常工作:

telnet localhost 端口号
Invoke-WebRequest -Uri "http://localhost:端口号"

总结

PowerShell提供了多种方法来监听本地端口,从简单的TCP监听器到完整的HTTP服务器。选择合适的方法取决于具体需求,如协议复杂度、性能要求和安全考虑。无论选择哪种方法,都应确保适当处理错误和资源清理,以保证稳定性和安全性。

注意: 在生产环境中使用这些技术前,请确保符合组织的安全政策和法律法规要求。

到此这篇关于使用PowerShell监听本地端口的多种方法的文章就介绍到这了,更多相关PowerShell监听本地端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文