我正在尝试编写一个使用telnet发送GPS坐标的程序 我一直得到以下例外:
Exception in thread "Timer-0" java.lang.NullPointerException
at org.apache.commons.net.telnet.Telnet._sendByte(Telnet.java:1060)
at org.apache.commons.net.telnet.TelnetOutputStream.write(TelnetOutputStream.java:87)
at org.apache.commons.net.io.ToNetASCIIOutputStream.write(ToNetASCIIOutputStream.java:77)
at org.apache.commons.net.io.ToNetASCIIOutputStream.write(ToNetASCIIOutputStream.java:111)
at java.io.PrintStream.write(PrintStream.java:430)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:85)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:168)
at java.io.PrintStream.write(PrintStream.java:477)
at java.io.PrintStream.print(PrintStream.java:619)
at java.io.PrintStream.println(PrintStream.java:756)
at com.example.myandroid.gpsSender$1.run(gpsSender.java:34)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
我不知道为什么我会这样做。你能告诉我吗?谢谢 这是我的代码:
package com.example.myandroid;
import org.apache.commons.net.telnet.TelnetClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.SocketException;
import java.util.Timer;
import java.util.TimerTask;
public class gpsSender {
private TelnetClient telnet = new TelnetClient();
public static void main(String[] args) throws Exception {
gpsSender client = new gpsSender();
client.start();
}
public String start() throws Exception {
// Connect to the specified server
telnet.connect("localhost", 5554);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
float longitude = 1;
float latitude = 1;
int count = 0;
PrintStream out = new PrintStream(telnet.getOutputStream());
public void run() {
out.println("geo fix " + String.valueOf(longitude) + " "
+ String.valueOf(latitude));
out.flush();
System.out.println("geo fix " + String.valueOf(longitude) + " "
+ String.valueOf(latitude));
longitude++;
latitude++;
count++;
if (count > 1000) {
cancel();
}
}
}, 0, 1000);
try {
telnet.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ("Done");
}
public void write(String value) {
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
该行
telnet.disconnect();
将要执行,因此您不会有要写入的输出流,因此NPE。你应该删除该行。
答案 1 :(得分:0)
尝试10.0.2.2而不是使用localhost,这是模拟器通常使用的IP地址,但我不确定您是否可以使用模拟器建立telnet通信。
编辑:这是一个link to telnet the emulator,但是它来自一个命令窗口 - 也许您可以为测试编写一个小批量脚本来发送gps坐标但是如果你必须以某种方式同步这个你的跑步测试,你必须从Android应用程序。看起来模拟器确实在localhost上,你的'pc'在10.0.2.2
答案 2 :(得分:0)
当然使用10.0.2.2 iP并确保您在清单中提供了正确的权限..但是,如果您需要输入long。和拉特。在另一个应用程序中使用它们...你真的不需要telnet和模拟器有一个叫做“模拟器控制”的小窗口,你手动输入长。和拉特。但是使用与模拟器的telnet通信,这可能不会发生。在真正的手机上你可以使用“NetwProvider.getLocation()”但当然你也无法在模拟器上测试它..
答案 3 :(得分:0)
感谢您发布此问题。这种方法让我可以在Robotium测试中轻松操作仿真器的硬件和传感器。这是一个代码片段,用于将仿真器的电池电量设置为100%:
TelnetClient telnet = new TelnetClient();
telnet.connect("10.0.2.2",5554);
PrintStream out = new PrintStream(telnet.getOutputStream());
out.println("power capacity 100");
out.flush();
telnet.disconnect();