【问题标题】:java simple telnet client using sockets使用套接字的 java 简单 telnet 客户端
【发布时间】:2011-09-17 23:29:09
【问题描述】:

我已经阅读了很多关于该主题的内容,telnet 是一种协议,而不是简单的套接字连接,等待换行符,使用外部库等等......

底线是我需要一个快速而肮脏的 java telnet 应用程序启动并运行,不一定可扩展也不一定漂亮,所以我试图避免使用库、系统函数调用等。我一直在尝试和测试,到目前为止,当我尝试登录路由器(当然是通过 telnet)时,我……什么都没有。

这是迄今为止我一直在使用的代码片段,请有人指出正确的方向,因为我不知道我还应该尝试什么,因为我确信它必须是真正的东西我想念的简单而愚蠢。提前致谢!

Socket socket = new Socket("192.168.1.1", 23);
socket.setKeepAlive(true);
BufferedReader r = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter w = new PrintWriter(socket.getOutputStream(),true);

int c=0;
while ((c = r.read()) != -1)
    System.out.print((char)c);

w.print("1234\r\n"); // also tried simply \n or \r
//w.flush();
//Thread.sleep(1000);

while ((c = r.read()) != -1)
    System.out.print((char)c);

w.print("1234\r\n");
//Thread.sleep(1000);

while ((c = r.read()) != -1)
    System.out.print((char)c);

socket.close();

【问题讨论】:

标签: java sockets telnet


【解决方案1】:

如果不针对您的特定路由器进行测试,很难知道您的示例有什么问题。使用库可能是个好主意,例如 http://sadun-util.sourceforge.net/telnet_library.html 看起来很容易使用。

这个网站还说:

为了进行对话,只需在套接字的输出流上发送命令即可发出命令(并使用 telnet 换行符序列 \r\n):

 String command="print hello"; 
 PrintWriter pw = new PrintWriter(
      new OutputStreamWriter(s.getOutputStream()), true);
 pw.print(command+"\r\n");

如果登录后会话似乎挂起,请避免将 StreamWriter 包装到 PrintWriter 中,而应在最后运行显式的 flush():

 Writer w = new OutputStreamWriter(s.getOutputStream());
 w.print(command+"\r\n");
 w.flush();

这实际上可能是您的代码的问题。

【讨论】:

  • 我也看到了,而且 Writer 没有 print(String) 方法,所以我尝试了 OutputStreamWriter,然后 print(String) 和 flush 但仍然没有。如果我使用常规命令行 telnet 它工作得很好,所以我想不出它有什么问题
  • 什么是错误,应用程序何时暂停?它会终止吗?
  • 我的应用首先读取登录页面的前 2 行:'Zyxel (something something)' 'Login:' And just stays there
  • 这意味着您的应用正在等待更多输入。 while ((c = r.read()) != -1) 在套接字关闭之前不会返回 -1。要么检查一个字符串,比如“登录:”,然后在收到时发送你的凭据。你也可以使用阻塞 io 超时。
  • 你完全正确!更改后,我终于可以正常工作了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多