应该连接到在我的PC上本地运行的服务器的代码无法正常工作。 这是一项似乎对其他人有用的任务。 我已经检查了诸如防火墙,正确的地址和端口检测,端口转发等内容。在模拟器上安装Telnet应用程序证明,使用10.0.2.2的模拟器可以在PC上以127.0.0.1到达运行于我的Python服务器。

这是代码,在这里我尝试了各种方法来解决潜在的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.access$800(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.

查看错误并按照错误进行操作,我无法理解导致套接字无法创建的原因。

#1楼 票数:2 已采纳

请参阅Thread start()和Runnable run()有什么区别

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

  ask by howdoyouturnthison translate from so

未解决问题?本站智能推荐:

1回复

Python套接字可作为telnet连接使用,并且需要双击

我正在使用telnet连接到设备。 连接后,我需要输入用户名admin ,按回车\\n并使用空白密码(再次输入\\n )。 在描述了登录过程之后,我应该以邀请(prompt) #结尾。 每次写入后,我正在从套接字读取。 该程序如下: 该程序的输出如下: 题: 为什么
2回复

从PC到设备的套接字连接失败

我正在为客户端-服务器应用程序使用套接字(即,客户端发送数据而服务器接收数据)。 我的代码如下。 当我在平板电脑上的Android 5.1应用程序中使用客户端,而在Windows 7 PC上的Java应用程序中使用服务器时,则效果很好(即,平板电脑可以将数据发送到PC)。 但是,当我尝试在
1回复

我的移动Android设备和PC之间的套接字连接

我想在我的移动Android设备和PC之间建立套接字连接,以便将字符串从我的手机发送到PC上运行的Android应用程序。
1回复

Android:使用套接字的Telnet-缺少最后一行

我正在尝试为Android编写一些MUD客户端,但是我遇到了服务器输出的问题。 我无法让我的应用在控制台中显示最后一行(登录提示)。
2回复

无法连接到 android 5.1 上的本地本地套接字

我有命令行工具,它发送广播和等待结果。 服务器代码(省略错误处理): Java客户端代码: 这一切都适用于 5.1 之前的 android。 在 android 5.1 connect() 上抛出异常: java.io.IOException:权限被拒绝 在 android.
1回复

Android:从套接字读取数据的最佳实践

我正在尝试绕过 Android 中的套接字。 特别是我想知道从套接字读取数据并将其呈现给 UI 的最佳实践是什么。 据我了解,我们不能在主 UI 线程中调用读取数据,因为它是一个阻塞操作。 所以我得到了这些从套接字读取数据的代码片段。 (顺便说一句,我从投票的 SO 问题中挑选了这些片段):
2回复

python中带有Telnet / Socket的AT命令

我有一个要发送AT命令的设备,我可以使用telnet或套接字将其连接到该设备。 我的问题是我无法发送AT命令或不知道如何接收它,我找到了一些有关此主题的文章,但他们都谈论串行连接。 我的问题是,如果我通过Telnet或Socket连接到终端并接收响应,发送AT命令的正确方法是什么?
2回复

为什么android udp-socket使用socket.recieve()方法丢失数据包?

我只是尝试使用套接字的recieve()方法。 当我发送短字符串的数据作为"send data" ,执行100次后,recieve()函数的性能会很好。 当我发送长字符串的数据时,例如"send data to the client,send data to the clien