简体   繁体   English

具有本地IP地址的简单客户端服务器程序

[英]Simple client server program with local IP address

I'm trying to get started with basic client server stuff. 我正在尝试入门基本的客户端服务器内容。 I have a Java server socket program running on one of my computers. 我有一台计算机上运行着Java服务器套接字程序。 My Android phone is running a simple application and is acting as the client. 我的Android手机正在运行一个简单的应用程序,并充当客户端。 I want the phone to be able to connect to the Java program on my computer. 我希望电话能够连接到计算机上的Java程序。

The client tries to connect to my computer's local IP address, but I can't get it to connect. 客户端尝试连接到我计算机的本地IP地址,但是我无法使其连接。 I get a IOException. 我得到IOException。 Here's the Android code I'm using: 这是我正在使用的Android代码:

        try {
            echoSocket = new Socket("192.168.0.19", 7077);
            System.out.println("length: "+ "socket created!");
        } catch (UnknownHostException e) {
            System.out.println("length: "+ "Don't know about host.");
        } catch (IOException e) {
            System.out.println("Couldn't get I/O for "
                    + "the connection.");
        }

If I run both the client and my server, on my computer and then try to connect to the computer's local IP (same as above), it works fine. 如果在计算机上同时运行客户端和服务器,然后尝试连接到计算机的本地IP(与上面相同),则可以正常工作。 But I want to connect from my phone. 但是我想通过手机连接。

Any ideas what I need to do? 有什么想法我需要做什么?

EDIT: Here's the stack trace: 编辑:这是堆栈跟踪:

   07-21 15:37:34.223: W/System.err(3474): android.os.NetworkOnMainThreadException
07-21 15:37:34.223: W/System.err(3474):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
07-21 15:37:34.223: W/System.err(3474):     at libcore.io.IoBridge.connect(IoBridge.java:112)
07-21 15:37:34.223: W/System.err(3474):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
07-21 15:37:34.223: W/System.err(3474):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.startupSocket(Socket.java:566)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.tryAllAddresses(Socket.java:127)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.<init>(Socket.java:177)
07-21 15:37:34.223: W/System.err(3474):     at java.net.Socket.<init>(Socket.java:149)
07-21 15:37:34.223: W/System.err(3474):     at com.nikhildev.cricketeye.MainActivity.startVideoCamera(MainActivity.java:45)
07-21 15:37:34.223: W/System.err(3474):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 15:37:34.223: W/System.err(3474):     at java.lang.reflect.Method.invoke(Method.java:511)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View$1.onClick(View.java:3594)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View.performClick(View.java:4204)
07-21 15:37:34.223: W/System.err(3474):     at android.view.View$PerformClick.run(View.java:17355)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Handler.handleCallback(Handler.java:725)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-21 15:37:34.223: W/System.err(3474):     at android.os.Looper.loop(Looper.java:137)
07-21 15:37:34.223: W/System.err(3474):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-21 15:37:34.233: W/System.err(3474):     at java.lang.reflect.Method.invokeNative(Native Method)
07-21 15:37:34.233: W/System.err(3474):     at java.lang.reflect.Method.invoke(Method.java:511)
07-21 15:37:34.233: W/System.err(3474):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-21 15:37:34.233: W/System.err(3474):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-21 15:37:34.233: W/System.err(3474):     at dalvik.system.NativeStart.main(Native Method)

With Android and sockets you need to watch out for a few things 使用Android和套接字,您需要注意一些事项

  1. Android needs to be the client, since its IP address is expected to change more frequently than that of the server Android需要成为客户端,因为预计其IP地址的更改频率要比服务器的更改频率更高
  2. The port number you use should be > 1024 您使用的端口号应> 1024
  3. If on a emulator, you need to be aware that the emulator's IP is 10.something. 如果在仿真器上,则需要知道仿真器的IP为10.something。 Look up the Android documentation. 查找Android文档。
  4. Permissions in the manifest 清单中的权限

Lastly, your issue is that you are running a network api in the main UI thread. 最后,您的问题是您正在主UI线程中运行网络api。 You need to run the same in a Async task. 您需要在异步任务中运行相同的命令。 Thats why you are getting the StrictMode exception thingy. 这就是为什么要获取StrictMode异常的原因。

Edit : 编辑:

As for the ping, check if you can ping to your network router. 至于ping,请检查是否可以ping通网络路由器。 And if you can ping to the outside world then your issue is that your router is blocking the ping inside. 而且,如果您可以ping通外部世界,那么问题就在于路由器阻止了ping通内部。

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

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