You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让批处理文件向已打开的Telnet连接发送信息?IRC客户端开发问题

解决批处理向已打开的Telnet连接发送命令的问题

嘿,我完全懂你的困扰——Windows自带的Telnet是个交互式程序,普通批处理里的echo命令根本没法把内容发送到已经运行的Telnet会话里。你的代码里,telnet %server% 6667会启动一个独立的交互式窗口,后面的echo命令都是等Telnet退出之后才执行的,自然不会被IRC服务器接收到。

下面给你两个原生Windows环境下的可行方案:

方案一:用VBScript模拟键盘输入(适配Telnet)

这个方法通过VBScript的SendKeys功能模拟手动输入,把USER和NICK命令自动发送到Telnet窗口里。

  1. 先创建一个名为send_irc.vbs的脚本文件,内容如下:
Set WshShell = WScript.CreateObject("WScript.Shell")
' 启动Telnet并连接服务器,9参数表示激活窗口
WshShell.Run "telnet " & WScript.Arguments(0) & " 6667", 9, False
' 等待1秒让连接建立(可根据网络情况调整时长)
WScript.Sleep 1000
' 发送USER命令,{ENTER}模拟回车
WshShell.SendKeys "USER " & WScript.Arguments(1) & " 8 * : " & WScript.Arguments(1) & "{ENTER}"
' 短暂等待后发送NICK命令
WScript.Sleep 500
WshShell.SendKeys "NICK " & WScript.Arguments(1) & "{ENTER}"
  1. 然后修改你的批处理文件,内容如下:
@echo off
SET /P server=[Server Address: ]
SET /P user=[Username/nick:]
' 调用VBS脚本,传递服务器地址和用户名参数
cscript //nologo send_irc.vbs "%server%" "%user%"

这个方案的核心是用VBS模拟手动输入,注意如果你的网络连接较慢,可以把WScript.Sleep的数值调大(比如改成2000代表2秒),确保Telnet完全连接上服务器后再发送命令。

方案二:用PowerShell直接操作TCP流(更可靠)

如果你想做一个真正的IRC客户端,Telnet的局限性太大了——用PowerShell直接通过TCP套接字发送数据会更稳定,不需要依赖模拟键盘:

创建一个.ps1文件(比如irc_client.ps1),内容如下:

# 获取用户输入
$server = Read-Host "Server Address"
$user = Read-Host "Username/nick"

# 建立TCP连接到IRC服务器
$tcpClient = New-Object System.Net.Sockets.TcpClient($server, 6667)
$stream = $tcpClient.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)

# 发送USER和NICK命令
$writer.WriteLine("USER $user 8 * : $user")
$writer.WriteLine("NICK $user")
$writer.Flush()

# 可选:添加读取服务器响应的逻辑
$reader = New-Object System.IO.StreamReader($stream)
while ($tcpClient.Connected) {
    $response = $reader.ReadLine()
    if ($response) {
        Write-Host $response
        # 可以在这里添加处理服务器消息的逻辑,比如响应PING命令
        if ($response.StartsWith("PING")) {
            $pong = $response.Replace("PING", "PONG")
            $writer.WriteLine($pong)
            $writer.Flush()
        }
    }
}

# 关闭连接
$writer.Close()
$reader.Close()
$tcpClient.Close()

这个方法直接和IRC服务器建立TCP连接,发送原始的IRC协议命令,不仅能自动发送USER/NICK,还能处理服务器的响应(比如必须的PING/PONG心跳),更适合开发完整的IRC客户端。

内容的提问来源于stack exchange,提问作者Ethan Johnson

火山引擎 最新活动