Android 套接字创建失败,Telnet 连接正常

Android Socket fails to create, Telnet connection works fine

应该在我的 PC 上本地连接到服务器 运行 的代码无法运行。这是一项似乎对其他人有用的任务的一部分。我已经检查了防火墙、正确的地址和端口感知检查、端口转发等。在模拟器上安装 Telnet 应用程序证明使用 10.0.2.2 从模拟器我可以到达 Python 服务器 运行我的电脑在 127.0.0.1.

这是代码,我在其中尝试了各种方法来尝试解决潜在的 InetAddress 或 Socket 问题:

package uk.ac.man.cs.COMP28512.lab4;

import android.app.Activity;

import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * Created by leeming
 * Code snippets from http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/
 */
public class ServerConnect extends Thread{

    public static final int BUFFER_SIZE = 2048;

    private Socket socket;
    private static final int SERVERPORT = 9999;         //This is the port that we are connecting to
                                                        //Remember the channel simulator is 9998

    private static final String SERVERIP = "10.0.2.2";  //This address is magically mapped to the host's loopback.

    private static final String LOGTAG = "SocketTester";

    boolean terminated = false;

    private PrintWriter out = null;
    private BufferedReader in = null;

    Activity parentref;

    /**
     *
     * @param parentRef Expects a reference to the calling activity, e.g. new ServerConnect(this);
     */
    public ServerConnect(Activity parentRef)
    {
        parentref=parentRef;
    }

    /**
     * Sends commands to the server. Called from UI thread via a button press
     * @param cmd
     */
    public void send(String cmd)
    {
        try
        {
            Log.i(LOGTAG,"Sending command: "+cmd);
            out.println(cmd);
        }
        catch(Exception e)
        {
            Log.e(LOGTAG,"Failed to send command : "+e);
        }
    }

    /**
     * Main thread loop that grabs incoming messages
     */
    public void run()
    {
        Log.i(LOGTAG,"Running socket thread");


        try
        {
//            InetAddress svrAddr = InetAddress.getByName(SERVERIP);
            byte[] Addr = new byte[]{10,0,2,2};
            InetAddress svrAddr = InetAddress.getByAddress(Addr);
            System.out.println("ADDRESS: " + svrAddr.toString());
            /*
            String IP = svrAddr.toString().substring(1);
            InetAddress realAddr = InetAddress.getByName(IP);
            System.out.println(IP);
            System.out.println(realAddr.getAddress().toString());
            */
            socket = new Socket(svrAddr, SERVERPORT);

//            if (realAddr.isReachable(1000))
//                System.out.println("Successfully reached");

            //Setup i/o streams
            out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //Keep listening for messages from server
            while(!terminated)
            {
                final String message = in.readLine();
                if(message != null && message != "")
                {
                    Log.i(LOGTAG,"MSG recv : "+message);

                    //Update GUI with any server responses
                    final TextView txtv = (TextView) parentref.findViewById(R.id.txtServerResponse);
                    parentref.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {



                            /**
                             *
                             *
                             * This is where the the UI gets updated by the socket
                             *
                             *
                             */



                            txtv.setText(message+"\n"+txtv.getText());
                        }
                    });
                }
            }

        }
        catch (UnknownHostException uhe)
        {
            Log.e(LOGTAG,"Unknownhost\n"+uhe.getStackTrace().toString());
        }
        catch (Exception e) {
            Log.e(LOGTAG, "Socket failed\n"+e.getMessage());
            e.printStackTrace();
        }

        disconnect();
        Log.i(LOGTAG,"Thread now closing");
    }

    /**
     * Disconnect from the server as well as closing i/o streams
     */
    public void disconnect()
    {
        Log.i(LOGTAG, "Disconnecting from server");
        try
        {
            in.close();
            out.close();
        }
        catch(Exception e)
        {/*do nothing*/}

        try
        {
            socket.close();
        }
        catch(Exception e)
        {/*do nothing*/}


    }

}

这是我得到的日志输出:

    03-30 21:08:39.846    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/MainPAge﹕ onCreate entered
03-30 21:08:39.852    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Running socket thread
03-30 21:08:39.861    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/System.out﹕ ADDRESS: /10.0.2.2
03-30 21:08:39.867    1115-1115/uk.ac.man.cs.COMP28512.lab4 E/SocketTester﹕ Socket failed
    null
03-30 21:08:39.868    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ android.os.NetworkOnMainThreadException
03-30 21:08:39.898    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-30 21:08:39.898    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
03-30 21:08:39.898    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
03-30 21:08:39.898    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
03-30 21:08:39.899    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
03-30 21:08:39.899    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
03-30 21:08:39.899    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.Socket.startupSocket(Socket.java:590)
03-30 21:08:39.899    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.net.Socket.<init>(Socket.java:226)
03-30 21:08:39.912    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at uk.ac.man.cs.COMP28512.lab4.ServerConnect.run(ServerConnect.java:85)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at uk.ac.man.cs.COMP28512.lab4.MainActivity.onCreate(MainActivity.java:33)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5933)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.access0(ActivityThread.java:144)
03-30 21:08:39.913    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5221)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-30 21:08:39.914    1115-1115/uk.ac.man.cs.COMP28512.lab4 W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-30 21:08:39.915    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Disconnecting from server
03-30 21:08:39.918    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/SocketTester﹕ Thread now closing
03-30 21:08:39.982    1115-1132/uk.ac.man.cs.COMP28512.lab4 D/OpenGLRenderer﹕ Render dirty regions requested: true
03-30 21:08:40.002    1115-1115/uk.ac.man.cs.COMP28512.lab4 D/﹕ HostConnection::get() New Host Connection established 0xaeef7a20, tid 1115
03-30 21:08:40.086    1115-1115/uk.ac.man.cs.COMP28512.lab4 D/Atlas﹕ Validating map...
03-30 21:08:40.437    1115-1132/uk.ac.man.cs.COMP28512.lab4 D/﹕ HostConnection::get() New Host Connection established 0xaeef74a0, tid 1132
03-30 21:08:40.508    1115-1132/uk.ac.man.cs.COMP28512.lab4 I/OpenGLRenderer﹕ Initialized EGL, version 1.4
03-30 21:08:40.605    1115-1132/uk.ac.man.cs.COMP28512.lab4 D/OpenGLRenderer﹕ Enabling debug mode 0
03-30 21:08:40.677    1115-1132/uk.ac.man.cs.COMP28512.lab4 W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-30 21:08:40.678    1115-1132/uk.ac.man.cs.COMP28512.lab4 W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa7a3b2e0, error=EGL_SUCCESS
03-30 21:08:40.812    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/Choreographer﹕ Skipped 39 frames!  The application may be doing too much work on its main thread.
03-30 21:08:41.773    1115-1115/uk.ac.man.cs.COMP28512.lab4 I/Choreographer﹕ Skipped 57 frames!  The application may be doing too much work on its main thread.

查看错误并跟踪错误,我无法理解可能导致无法创建套接字的原因。

What's the difference between Thread start() and Runnable run()

看起来您是在直接调用 运行() 而不是通过 start()。