【问题标题】:Android connect to tethering socketAndroid连接到网络共享套接字
【发布时间】:2013-07-24 05:49:05
【问题描述】:

我有 2 台 android 设备,其中一台充当服务器,处于网络共享模式,并接受与端口的连接。 另一台设备充当客户端,连接到服务器热点并通过端口与服务器建立连接。 (一切都是在中间没有路由器的情况下完成的)。

服务器代码如下:(android服务器执行代码时,设备处于tethering模式)

ServerSocket server = new ServerSocket(PORT);

while (true) {
    Socket client;
    client = server.accept();
    ClientThread com = new ClientThread(client, this);
    Thread t = new Thread(com);
    t.start();
}

客户端代码如下所示:(当android客户端执行此代码时,设备连接到接入点)

Socket client = new Socket();
int serverIP = wifiManager.getDhcpInfo().serverAddress;
String stringIP = android.text.format.Formatter.formatIpAddress(serverIP);
InetAddress address = InetAddress.getByName(stringIP);
SocketAddress socketAddress = new InetSocketAddress(address, PORT);
client.connect(socketAddress);

我在客户端收到以下错误

java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable)
  at libcore.io.IoBridge.connect(IoBridge.java:114)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
  at java.net.Socket.connect(Socket.java:842)
  at java.net.Socket.connect(Socket.java:785)
  at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283)
  at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189)
  at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59)
  at java.lang.Thread.run(Thread.java:856)
Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
  at libcore.io.Posix.connect(Native Method)
  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
  at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
  at libcore.io.IoBridge.connect(IoBridge.java:112)
... 8 more

服务器没有给出错误。

我在 android 清单文件中设置了以下权限:

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

理想情况下,我需要将一些数据从服务器传输到客户端。

我做错了什么?

【问题讨论】:

    标签: android sockets


    【解决方案1】:

    在 tethered wifi 连接中,连接提供者不能作为客户端工作。所以我们需要实现一个双向的tcp socket连接。在处于网络共享模式的设备中使用具有端口号的服务器套接字。该设备充当服务器。在客户端设备中使用套接字通过 IP 地址访问客户端端口。

    【讨论】:

      【解决方案2】:

      服务器端

      class ServerThread implements Runnable {
      
          public void run() {
              socket = new Socket();
      
              try {
                  serverSocket = new ServerSocket(SERVERPORT);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              while (!Thread.currentThread().isInterrupted()) {
                  try {
                          socket = serverSocket.accept();
      
                      CommunicationThread commThread = new CommunicationThread(socket);
                      new Thread(commThread).start();
      
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
      

      客户端

      class ClientThread implements Runnable {
      
          @Override
          public void run() {
              try {
                  socket = new Socket();
                  InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT);
                  socket.connect(socketAddress);
      
                  CommunicationThread commThread = new CommunicationThread(socket);
                  new Thread(commThread).start();
      
              } catch (UnknownHostException e1) {
                  e1.printStackTrace();
              } catch (IOException e1) {
                  e1.printStackTrace();
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        通过测试发现无法在网络共享设备上建立连接。

        但是如果我们反转这个过程并在连接的客户端上打开一个 serversocket。并从网络共享设备连接到它,它会工作。

        因此,逆转沟通就是答案。

        【讨论】:

        • 我该怎么做?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 2016-02-03
        相关资源
        最近更新 更多