2015-06-09 38 views
1

我正在尝试使用apache.commons.net.telnet为Cisco交换机(2960)编写Android应用程序作为telnet客户端。但我有连接问题。没有输出显示在android模拟器上,但ConnectBot运行在同一模拟器上,并且可以完美地远程登录到交换机。下面是代码示例:使用Android Java应用程序的Cisco交换机的Telnet客户端

MainActivity.java

package com.example.android2switch; 

import java.io.IOException; 
import java.net.SocketException; 
import java.util.ArrayList; 

import org.apache.commons.net.telnet.EchoOptionHandler; 
import org.apache.commons.net.telnet.InvalidTelnetOptionException; 
import org.apache.commons.net.telnet.SuppressGAOptionHandler; 
import org.apache.commons.net.telnet.TelnetClient; 
import org.apache.commons.net.telnet.TelnetOptionHandler; 
import org.apache.commons.net.telnet.TerminalTypeOptionHandler; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.view.View; 

public class MainActivity extends Activity { 

    Button button; 
    TextView textview; 
    EditText edit1; 
    Editable server; 
    static TelnetClient telnetClient = new TelnetClient(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button b1=(Button)findViewById(R.id.button1); 
     b1.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       try { 
        setOptionHandlers(); 
        //telnetClient.connect("192.168.0.1"); 
        edit1 = (EditText)findViewById(R.id.edit1); 
        server = edit1.getEditableText(); 
        telnetClient.connect(server.toString()); 

        read(); 
        telnetClient.disconnect(); 
       } catch (SocketException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       }});  
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private static void setOptionHandlers() throws IOException { 
     ArrayList<TelnetOptionHandler> optionHandlers = new ArrayList<TelnetOptionHandler>(); 
     optionHandlers.add(new TerminalTypeOptionHandler("VT100", false, false, true, false)); 
     optionHandlers.add(new EchoOptionHandler(true, false, true, false)); 
     optionHandlers.add(new SuppressGAOptionHandler(true, true, true, true)); 
     for (TelnetOptionHandler handler : optionHandlers) { 
      try { 
       telnetClient.addOptionHandler(handler); 
      } 
      catch (InvalidTelnetOptionException e) { 
       System.err.println("Error registering option handler " + handler.getClass().getSimpleName()); 
      } 
     } 
    } 

    public static void write(byte[] data) throws IOException { 
     telnetClient.getOutputStream().write(data); 
     telnetClient.getOutputStream().flush(); 
    } 

    public void read() throws IOException { 

     TextView tv1=(TextView)findViewById(R.id.textView1); 
     tv1.setText("Read"); 
     byte[] buff = new byte[1024]; 
     int read; 
     if((read = telnetClient.getInputStream().read(buff)) > 0) { 
      tv1.append(new String(buff)); 
     } 
     tv1.append("read="+read); 
    } 

} 

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.example.android2switch.MainActivity" > 

<EditText 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:id="@+id/edit1" 
android:hint="Command" 
android:text="ip address" /> 
<Button 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:text="Run Program" 
android:id="@+id/button1" /> 
<ScrollView 
android:id="@+id/scrollView1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 
<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 

<TextView 
android:id="@+id/textView1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
/> 

</LinearLayout> 
</ScrollView> 
</LinearLayout> 

logcat的

06-10 00:35:52.976: E/Trace(1938): error opening trace file: No such file or directory (2) 
06-10 00:35:53.716: D/libEGL(1938): loaded /system/lib/egl/libEGL_emulation.so 
06-10 00:35:53.716: D/libEGL(1938): loaded /system/lib/egl/libGLESv1_CM_emulation.so 
06-10 00:35:53.716: D/libEGL(1938): loaded /system/lib/egl/libGLESv2_emulation.so 
06-10 00:35:53.726: D/(1938): HostConnection::get() New Host Connection established 0xb8c6d868, tid 1938 
06-10 00:35:53.887: W/EGL_emulation(1938): eglSurfaceAttrib not implemented 
06-10 00:35:53.906: D/OpenGLRenderer(1938): Enabling debug mode 0 
06-10 00:36:26.367: W/EGL_emulation(1938): eglSurfaceAttrib not implemented 
06-10 00:36:39.556: D/AndroidRuntime(1938): Shutting down VM 
06-10 00:36:39.556: W/dalvikvm(1938): threadid=1: thread exiting with uncaught exception (group=0xb3df9288) 
06-10 00:36:39.616: E/AndroidRuntime(1938): FATAL EXCEPTION: main 
06-10 00:36:39.616: E/AndroidRuntime(1938): android.os.NetworkOnMainThreadException 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at java.net.Socket.connect(Socket.java:842) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at org.apache.commons.net.SocketClient.connect(SocketClient.java:182) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at org.apache.commons.net.SocketClient.connect(SocketClient.java:203) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at org.apache.commons.net.SocketClient.connect(SocketClient.java:296) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at com.example.android2switch.MainActivity$1.onClick(MainActivity.java:45) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.view.View.performClick(View.java:4084) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.view.View$PerformClick.run(View.java:16966) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.os.Handler.handleCallback(Handler.java:615) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.os.Looper.loop(Looper.java:137) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
06-10 00:36:39.616: E/AndroidRuntime(1938):  at dalvik.system.NativeStart.main(Native Method) 

我完全新的Android开发(Eclipse的月神)和我找不到任何关于cisco交换机/路由器的android base telnet客户端的参考资料/例子。 任何参考,示例代码或指导将非常感谢,谢谢!

+0

可能重复:socket失败:EACCES(权限否则)'](http://stackoverflow.com/questions/11273197/error-message-java-net-socketexception-socket-failed-eacces-permission-denie) –

+0

@HoboSapiens我仍然有问题“错误开放跟踪文件“和”致命异常主“。任何类似的示例项目,示例代码,参考或指导将非常感谢,谢谢先生! – emmesh

回答

1

您是否向清单文件添加了正确的权限? 确保您已添加允许应用程序打开网络套接字的权限。

"<uses-permission android:name="android.permission.INTERNET"/> 

在这里看到的细节: http://developer.android.com/reference/android/Manifest.permission.html

而且,类似的问题在这里得到解决:Error message 'java.net.SocketException: socket failed: EACCES (Permission denied)'

[错误消息“java.net.SocketException异常的
+0

@ Fund3burk;感谢您的快速回复和建议/参考。我添加了权限并且遇到了新的异常“android.os.NetworkOnMainThreadException”。在eclipse中没有错误,只有在logcat上,我不知道是否我写的代码正确。我该怎么办? – emmesh

+0

您正试图在主线程中运行联网操作。这会导致您遇到的错误。你可以通过在'AsyncTask'中运行你的代码来解决这个问题。检查这里的api:http://developer.android.com/reference/android/os/AsyncTask.html – Fund3rburk

+0

此外,发现另一个类似的问题已解决。如果你是新手,可能需要一些时间才能把这一切都弄清楚,但是你正在前进。 http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – Fund3rburk