当前位置: 首页 > news >正文

使用PowerShell监听本地端口

使用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.ResponseWrite-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. 资源管理: 长时间运行的监听器应包含适当的错误处理和资源清理

测试监听器

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

  1. 使用Web浏览器访问 http://localhost:端口号
  2. 使用Telnet客户端:
    telnet localhost 端口号
    
  3. 使用PowerShell发送测试请求:
    Invoke-WebRequest -Uri "http://localhost:端口号"
    

总结

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

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

http://www.dtcms.com/a/360405.html

相关文章:

  • 多线程案例、线程池
  • QT6(QStandardItemModel和QTableView及自定义代理)
  • 第3章 乱码的前世今生-字符集和比较规则
  • 部署在windows的docker中的dify知识库存储位置
  • 常见线程池的创建方式及应用场景
  • Cookie、Session 和 JWT
  • 【K8s-Day 22】深入解析 Kubernetes Deployment:现代应用部署的基石与滚动更新的艺术
  • 服装管理软件与工厂计件系统精选
  • 【OpenGL】LearnOpenGL学习笔记18 - Uniform缓冲对象UBO
  • [每周一更]-(第158期):构建高性能数据库:MySQL 与 PostgreSQL 系统化问题管理与优化指南
  • XPlayer播放器APP:安卓平台上的全能视频播放器
  • 网络代理协议深度对比
  • Linux/UNIX系统编程手册笔记:系统和进程信息、文件I/O缓冲、系统编程概念以及文件属性
  • Multi-Head RAG: Solving Multi-Aspect Problems with LLMs
  • ST-2110概述
  • MySQL专题Day(1)————事务
  • postman 用于接口测试,举例
  • Linux shell 脚本基础 003
  • centos7安装jdk17
  • c++程序员日常超实用工具(长期记录更新)
  • PS自由变换
  • 【人工智能99问】LLaMA中的RoPE是什么?(35/99)
  • 学习Python中Selenium模块的基本用法(12:操作Cookie)
  • 【系统分析师】高分论文:论大数据架构的应用
  • 写一个 RTX 5080 上的 cuda gemm fp16
  • 使用yt-dlp下载网页视频
  • synchronized的锁对象 和 wait,notify的调用者之间的关系
  • Wi-Fi技术——初识
  • Flink NettyBufferPool
  • Docker中使用Compose配置现有网络