繁体   English   中英

无法从Android上的Telnet服务器收到任何响应

[英]Can't receive any response from Telnet server on Android

我需要在Android上实现一个简单的telnet客户端。 我尝试使用org.apache.commons.net.telnet.TelnetClient类:

TelnetClient telnet = new TelnetClient();

telnet.connect( "localhost", PORT);

InputStream inStream = telnet.getInputStream();
PrintStream outStream = new PrintStream( telnet.getOutputStream());

outStream.println( COMMAND);
outStream.flush();

int ch = 0;
while( ( ch = inStream.read()) != -1) {
    log("Respose:" + ch);
}

但是inStream.read()块。

同时,我可以使用Market的远程应用从服务器获得响应。

知道我在做什么错吗?

我正在使用apache telnet客户端,我遇到了同样的问题。 原因是telnet服务器正在响应流,并且没有END令牌。 像行尾..etc之类的东西。

因此,您将不断获取字节,如果没有传入的字节,则它将在read()方法处阻塞。

因此,我使用StringBuilder将所有传入的字节保留为char,并且还跟踪特定的字符串(“:/#”),该字符串始终位于传输流的末尾(用于telnet连接)。 即使是第一次连接。

这是我使用的代码的一部分。

StringBuilder builder = new StringBuilder();
TelnetClient telnet = new TelnetClient();
telnet.connect("127.0.0.1", 23);
outstr = telnet.getOutputStream();
instr = telnet.getInputStream();
int cnt =0;
    while(isConnected){
        if(builder.toString().endsWith(":/ #")){
                cnt++;
                if(cnt==2){
                    Log.i("DATA : ", builder.toString());
                    builder.delete(0, builder.length());
                    cnt=1;
                }
        }
        builder.append((char)instr.read());

    }

如果您注意到如果计数器“ cnt”达到2,并且计数器设置为1,则清除了生成器。“ cnt”显示了令牌的数量(“:/#”),我选择定义流的结尾。

第一个连接将给出第一个令牌,但是要获得结束,您需要计数器来确定它是否为结束令牌。 这就是为什么我使用计数器。

建议:将侦听代码保留在不同的线程上,并在另一线程中命令发送代码。 (最终,由于Android,您将需要处理networkOnMainThread ..etc。)

不是 :上面的代码不是完整副本。 但这是工作的简化部分。 完整版本将侦听,命令发送和异常处理以分布式形式分开。

在一些字符后会阻塞吗? 因为您要求它仅在达到inputStream的末尾时才停止读取。

我不了解telnet协议,但在我看来您应该使用BufferedReader从输入流中读取行,并在从服务器读取行后立即对其进行处理。

我认为不要使用“ localhost”,而要使用该特定计算机的IP地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM