我需要一些方向。不确定我是否走在正确的道路上,但我想是的。我正在尝试创建一个telnet java程序,它将连接到客户端计算机,执行单个命令然后断开连接。当我连接到linux机器或路由器时,我能够让程序工作并将InputStream读出到Text字段(用于测试目的)。但是当我连接到Windows机器或其他客户端计算机时,它无法正常工作。它读出一些随机字符,然后锁定。
以下是我的代码。我已经看到了其他代码的示例以及来自Apache的API。我真的很想看看我是否可以使用Java Sockets。
public class TestSockets extends JFrame implements ActionListener {
/**
* @param args
*/
private String USER = "User";
private String PASS = "Password01";
private final static String CMD = "exit\r\n";
private static Socket telnet = null;
private PrintWriter writer = null;
private static InputStream reader = null;
private String host = "192.168.1.1";
private int port = 23;
TextArea javatext;
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestSockets().setVisible(true);
}
private TestSockets() {
super("Testing Buttons");
//Set JFrame size
setSize(500, 600);
//Gives JFrame a location
setLocation(100, 100);
//set layout
setLayout(new FlowLayout());
javatext = new TextArea(25, 65);
add(javatext);
//Ask for window decorations provided by the look and feel.
JFrame.setDefaultLookAndFeelDecorated(true);
JButton button3 = new JButton("Run Program");
button3.addActionListener(this);
add(button3);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
try {
telnet = new Socket(host, port);
telnet.setKeepAlive(true);
//reader = telnet.getInputStream();
writer = new PrintWriter(telnet.getOutputStream());
reader = telnet.getInputStream();
//out = telnet.getOutputStream();
//Process p = Runtime.getRuntime().exec("telnet " + server.toString(), null, null);
//DataOutputStream os = new DataOutputStream(p.getOutputStream());
//DataInputStream in = new DataInputStream(p.getInputStream());
StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[4096]; // Read 4K characters at a time
int len; // How many chars read each time
while ((len = reader.read(buffer)) != -1) {
String readchar = new String(buffer, 0, len);
sb.append(readchar + "\n");
System.out.println(readchar);
javatext.append(readchar);
if (readchar.endsWith("login: ")) {
writer.print(USER + "\r\n");
writer.flush();
}
if (readchar.endsWith("Password: ")) {
writer.print(PASS + "\r\n");
writer.flush();
}
if (readchar.endsWith("password: ")) {
writer.print(PASS + "\r\n");
writer.flush();
}
if (readchar.endsWith("# ")) {
writer.print(CMD);
writer.flush();
}
if (readchar.endsWith("# ")) {
writer.print(CMD);
writer.flush();
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
感谢大家的帮助。我真的试图让这个在Android上工作,但只是在直接的Java应用程序中进行粗略的草案。我得到了粗略的想法,它的工作原理。如果我读取输出,它只是一遍又一遍地重复我的StringBuilder中的所有字符。不是一个大问题,我不是真的想要显示输出。这是我完成的。希望如果需要,这可以帮助其他任何人。
public class AndroidSocket extends Activity implements OnClickListener {
TextView text;
EditText edit1, edit2, edit3, edit4;
private String USER = null;
private String PASS = null;
Editable server, username, password, command;
private String CMD = null;
private PrintStream writer = null;
private static BufferedReader reader = null;
private String host = null;
private int port = 23;
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
StringBuffer sb;
Handler mHandler = new Handler();
int len;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text);
edit1 = (EditText)findViewById(R.id.edit1);
edit2 = (EditText)findViewById(R.id.edit2);
edit3 = (EditText)findViewById(R.id.edit3);
edit4 = (EditText)findViewById(R.id.edit4);
server = edit1.getEditableText();
username = edit2.getEditableText();
password = edit3.getEditableText();
command = edit4.getEditableText();
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
text.setText("Android Socket" + "\n");
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
text.setText("Android Socket" + "\n");
try {
telnet.connect(server.toString(), 23);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
reader = new BufferedReader(new InputStreamReader(telnet.getInputStream()));
writer = new PrintStream(telnet.getOutputStream());
telnet.setKeepAlive(true);
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
sb = new StringBuffer();
//char[] buffer = new char[1024];
while (true)
{
len = in.read();
String s = Character.toString((char)len);
sb.append( s );
AndroidSocket.this.mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
AndroidSocket.this.text.getText();
AndroidSocket.this.text.append( sb.toString() );
}
});
System.out.println( sb );
mylogin();
mypass();
mycommand();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
mThread.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void mycommand() throws IOException {
// TODO Auto-generated method stub
if (sb.toString().endsWith("> ")) {
out.println(command.toString() + "\r\n");
out.flush();
out.println("exit\r\n");
out.flush();
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
disconnect();
} else
if (sb.toString().endsWith("# ")) {
out.println(command.toString() + "\r\n");
out.flush();
out.println("exit\r\n");
out.flush();
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
disconnect();
}
}
private void mypass() {
// TODO Auto-generated method stub
if (sb.toString().endsWith("Password: ")) {
out.println(password.toString() + "\r\n");
out.flush();
} else
if (sb.toString().endsWith("password: ")) {
out.println(password.toString() + "\r\n");
out.flush();
}
}
private void mylogin() {
// TODO Auto-generated method stub
if (sb.toString().endsWith("login: ")) {
out.println(username.toString() + "\r");
out.flush();
}
}
public void disconnect() {
try {
in.close();
out.close();
telnet.disconnect();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:2)
Telnet不仅仅是一个原始套接字,还有需要解释的控制代码(在每个方向上)。
不要自己尝试这样做,而是最好使用像Apache Commons Net中那样的现有Java Telnet客户端库。
答案 2 :(得分:1)
如果您看到的'随机追踪者'以0xFF字节开头,则它们是Telnet协议命令。
但是你有另一个问题。不要在事件线程中执行长时间运行或阻塞操作。使用单独的线程。