简体   繁体   English

Android套接字连接麻烦

[英]Android socket connection troubles

I made a client(android (java))-server(node.js) application. 我做了一个客户端(android(java)) - 服务器(node.js)应用程序。

The problem is when I use AVD emulator (with 10.0.2.2 or exteranl IP) to test my programm, ewerything works well, but when I try to do the same with phone or another emulator (genimotion, nox, bluestacks) it I can`t connect at all. 问题是当我使用AVD模拟器(使用10.0.2.2或扩展IP)来测试我的程序时,ewerything运行良好,但当我尝试用手机或其他模拟器(genimotion,nox,bluestacks)做同样的事情时,我可以`完全连接。

Users permisson to use internet and wi-fi is required. 用户需要使用互联网和Wi-Fi。 The code of connect function is: 连接功能的代码是:

    public void Connect(String Host, int Port)
{
    try
    {
        System.out.println(Handlers.isEmpty());
        if (Handlers.isEmpty())
            throw new NullPointerException ("No handlers");

        if (Socket != null && Socket.isConnected())
            Socket.close();

        InetAddress IpAddress = InetAddress.getByName(Host);
        Address = new InetSocketAddress(IpAddress, Port);
        Socket = new Socket();
        Socket.setSoTimeout(1000);
        Socket.connect(Address, 1500);
        InputStream = new BufferedReader (new InputStreamReader(Socket.getInputStream()));
        OutputStream = new PrintWriter (Socket.getOutputStream());
        RThread = new ReadSocketThread(InputStream, Handlers, SearchName);
        ReadSocket = new Thread(RThread);
        ReadSocket.start();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

}

and the console said: 而控制台说:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: bobko.alexandr.consultant, PID: 1599
              java.lang.IllegalStateException: Could not execute method for android:onClick
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                  at android.view.View.performClick(View.java:4438)
                  at android.view.View$PerformClick.run(View.java:18422)
                  at android.os.Handler.handleCallback(Handler.java:733)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:136)
                  at android.app.ActivityThread.main(ActivityThread.java:5045)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                  at android.view.View.performClick(View.java:4438) 
                  at android.view.View$PerformClick.run(View.java:18422) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:136) 
                  at android.app.ActivityThread.main(ActivityThread.java:5045) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                  at dalvik.system.NativeStart.main(Native Method) 
               Caused by: android.os.NetworkOnMainThreadException
                  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
                  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
                  at libcore.io.IoBridge.connectErrno(IoBridge.java:144)
                  at libcore.io.IoBridge.connect(IoBridge.java:112)
                  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
                  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
                  at java.net.Socket.connect(Socket.java:843)
                  at bobko.alexandr.consultant.STAPLibrary.STAPLibraryMain.Connect(STAPLibraryMain.java:53)
                  at bobko.alexandr.consultant.MainActivity.Create(MainActivity.java:29)
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                  at android.view.View.performClick(View.java:4438) 
                  at android.view.View$PerformClick.run(View.java:18422) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:136) 
                  at android.app.ActivityThread.main(ActivityThread.java:5045) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                  at dalvik.system.NativeStart.main(Native Method) 

Application terminated. 申请终止。

As you are performing network operation in main thread NetworkOnMainThreadException is thrown. 当您在主线程中执行网络操作时,会抛出NetworkOnMainThreadException That's why you are not able to connect. 这就是你无法连接的原因。

You should either wrap the code that connects to network inside a AsyncTask or use library like Retrofit . 您应该在AsyncTask包装连接到网络的代码,或者使用像Retrofit这样的库。 Simply, network operation must be run in a thread other than main UI thread. 简单地说,网络操作必须在主UI线程以外的线程中运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM