【问题标题】:Connect PC to Android device to form a Client-Server link via USB cable通过 USB 电缆将 PC 连接到 Android 设备以形成客户端-服务器链接
【发布时间】:2017-01-15 13:54:19
【问题描述】:

我想通过 USB 电缆将 Android 设备与 Windows 笔记本电脑作为客户端-服务器桥接。我用 Java 编写了我的客户端代码。当我的设备连接到我的 WiFi 调制解调器并且我的笔记本电脑也用 LAN 电缆连接时,我将应用程序桌面上的 android 设备 IP 设置为连接到服务器套接字的地址。但是,当我的 WiFi 调制解调器关闭并且我想用 USB 电缆连接 Android 设备和笔记本电脑时。我的设备的 IP 地址不可用,我无法连接到 Android 设备。

另一个问题:我可以通过USB线连接到服务器并打开带有IP地址的套接字吗?

Android 代码

public class ActivityMain extends AppCompatActivity {
private Button button ;
public static final int TIMEOUT = 10;
private String connectionStatus = null;
private Handler mHandler = null;
private ServerSocket serverSocket = null;
private Socket socket = null;
private ObjectOutputStream  objectOutputStream;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);

configure_button();
 }

  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
      case 10:
        configure_button();
        break;
      default:
        break;
    }
  }
  void configure_button() {
    // first check for permissions
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
      ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
      ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET)               != PackageManager.PERMISSION_GRANTED) {

      if  (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)  {
        requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.INTERNET}, 10);
      }
      return;
    }
    //this code won't execute if permissions are not allower, because in the line above there is return statement.
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        //initialize serverSocket socket in a new separate thread
        new Thread(initializeConnection).start();
        String msg = "Attempting to connect";
        Toast.makeText(ActivityMain.this, msg, Toast.LENGTH_SHORT).show();
      }
    });
  }

  //threads
  private final Runnable initializeConnection = new Thread(){
@Override
public void run() {
  // initialize server socket
  try {
    serverSocket = new ServerSocket(38300);
    serverSocket.setSoTimeout(ActivityMain.TIMEOUT * 1000);

    //attempt to accept a connection
    socket = serverSocket.accept();

    objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
    try {
      while(true) {
        for (int i = 0; i < 1000; i++) {
          //objectOutputStream.reset();
          objectOutputStream.writeObject("number" + i);
          // objectOutputStream.writeBytes("number"+i);
          System.out.println("send>" + "number" + i);
        }
      }
    } catch (IOException ioException) {
      //Log.e(ActivityMain.TAG, "" + ioException);
    }
  } catch (SocketTimeoutException e) {
    connectionStatus = "Connection has timed objectOutputStream! Please try again";
    // mHandler.post(showConnectionStatus);
  }
  catch(IOException e)
  {
    //Log.e(ActivityMain.TAG, ""+e);
  }

  if(socket != null)
  {
    connectionStatus = "Connection was succesful";
    // mHandler.post(showConnectionStatus);
  }
}
};
}

客户端代码

public class CCC {  
    public static void main(String[] args)
    {
        System.out.println("hi");
        Socket echoSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;
        String message = "";

        // Create socket connection with host address as localhost and port number with 38300 
        try
        {
            echoSocket = new Socket("192.168.1.19", 38300);

            in = new ObjectInputStream(echoSocket.getInputStream());

            // Communicating with the server
            try
            {
                while(true){
                message = (String) in.readObject();
                System.out.println("server>" + message);

                }
            }
            catch (ClassNotFoundException classNot)
            {
                System.err.println("data received in unknown format");
            }
        }
        catch (UnknownHostException e)
        {
            System.err.println("Don't know about host: LocalHost.");
            System.exit(1);
        }
        catch (IOException e)
        {
            System.err.println("Couldn't get I/O for " + "the connection to: LocalHost:");
            System.exit(1);
        }
        finally
        {
            // Closing connection
            try
            {
                in.close();

                if (echoSocket != null)
                {
                    echoSocket.close();
                }
            }
            catch (IOException ioException)
            {
                ioException.printStackTrace();
            }
        }
    }
}

我需要每隔一秒从服务器向客户端发送位置数据;

【问题讨论】:

  • 向我们展示您的努力。你尝试过什么吗?你在哪里失败了?
  • @rupinderjeet 代码已添加。当我在客户端-服务器之间使用 WIFI 连接时,我有 Android 设备 IP,我在文本文件中写入地址,客户端读取该文本文件并使用 IP 连接到服务器但是当我使用 USB 电缆时出现错误,无法将客户端连接到服务器。

标签: java android sockets


【解决方案1】:

我终于找到答案了。用于 PC 到 Android 设备客户端-服务器形式的通信。你应该使用 ADB。你应该去巫婆 cmd 到你的电脑中的 adb 位置并输入>adb forward tcp:38300(例如 38300 的端口号)tcp:38300 并且您的 IDE 应该在使用此命令后关闭,使用“localhost”代替 Android 设备 IP,如 this->echoSocket = new Socket("localhost", 38300); 并且完成了。

【讨论】:

    【解决方案2】:

    在客户端代码中,您正在使用 while(true) 无限读取 ObjectInputStream。如果到达文件末尾,则不会跳出循环。

    程序不能再读取了,因为它已经到了文件的末尾,所以EOFException可能会被抛出。使用if(in.readObject() != null) 进行检查。您应该捕获异常并自然处理它。

    try {
        while(true) {
            message = in.readObject(); 
            System.out.println("server>" + message);
        }
    } catch (EOFException e) { 
        // handle exception
        System.out.println("Reached end of file while reading.");
    }
    

    EOFException 帮助你跳出循环。

    【讨论】:

    • 我需要每隔一秒将位置数据放入 OutPutStream object 。并在客户端使用InputStream 对象阅读它,我更改了我的代码,但我还有问题。在与 Android 设备中的 WIFI 调制解调器通信的客户端-服务器中,我有一个本地 IP,但是当我使用 USB 电缆时,我没有 IP 我应该如何在客户端提供地址以查找服务器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2016-08-14
    • 1970-01-01
    • 2012-12-06
    • 2012-05-12
    相关资源
    最近更新 更多