Android 与 PC 之间的通信

当PC与手机连通时,我们可以通过Socket连接来实现PC与手机间的通信。

 

这里我们先讨论手机做为Server端、PC做为Client端的情况。

 

和其他Java Socket程序一样,只需要定义一个SocketServer即可实现Server端的监听,如下:

 

Java代码   收藏代码
  1. ServerSocket serverSocket = new ServerSocket(SOCKET_PORT);  

 

写Java Socket的时候,我们都知道,要连上这个Server,只需要知道Server的IP地址和Port号就可以了。这里因为手机是和PC相连的,因此麻烦就在于怎么定位这个IP地址和Port号。

 

IP地址其实也就是本机地址,而port号则需要有一点点技巧,需要用到adb工具。查看adb帮助中,有一条forward命令可以用于完全任务:

Html代码   收藏代码
  1. adb forward <local> <remote> - forward socket connections  
  2.                                forward specs are one of:  
  3.                                  tcp:<port>  
  4.                                  localabstract:<unix domain socket name>  
  5.                                  localreserved:<unix domain socket name>  
  6.                                  localfilesystem:<unix domain socket name>  
  7.                                  dev:<character device name>  
  8.                                  jdwp:<process pid> (remote only)  

 使用如下:

 

adb forward tcp:Local_Port tcp:Remote_Port

 

也即将本地的Local_Port端口,映射为Remote_Port端口,这里的Remote_Port即为上面的SOCKET_PORT。

 

所以Client代码可以如下实现:

Java代码   收藏代码
  1. String adb_path=....;  
  2.   
  3. Runtime.getRuntime().exec(adb_path + " forward tcp:LocalPort tcp:Remote_Port");  
  4.   
  5. Socket socket = new Socket("localhost", Local_Port);  

即可实现PC与Android之间的通信。这里注意Android端需要有网络访问的权限:

Java代码   收藏代码
  1. <uses-permission android:name="android.permission.INTERNET" />  
AndroidPC之间进行TCP通信可以分为两个部分:客户端和服务端。其中,Android设备可以是客户端或服务端,PC也可以是客户端或服务端,因此总共有四种组合方式。 下面是一个基本的Android客户端和PC服务端之间的TCP通信示例: 1. 客户端代码(Android平台) ```java public class MainActivity extends AppCompatActivity { private Button mBtnConnect; private EditText mEtIP, mEtPort, mEtContent; private TextView mTvResponse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnConnect = findViewById(R.id.btn_connect); mEtIP = findViewById(R.id.et_ip); mEtPort = findViewById(R.id.et_port); mEtContent = findViewById(R.id.et_content); mTvResponse = findViewById(R.id.tv_response); mBtnConnect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { try { // 获取IP地址和端口号 String ip = mEtIP.getText().toString().trim(); int port = Integer.parseInt(mEtPort.getText().toString().trim()); // 创建Socket对象 Socket socket = new Socket(ip, port); // 获取输出流 OutputStream outputStream = socket.getOutputStream(); // 发送数据 String content = mEtContent.getText().toString().trim(); outputStream.write(content.getBytes("UTF-8")); // 获取输入流 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); final String response = new String(buffer, 0, len, "UTF-8"); // 显示响应结果 runOnUiThread(new Runnable() { @Override public void run() { mTvResponse.setText(response); } }); // 关闭Socket对象 socket.close(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }); } } ``` 2. 服务端代码(PC平台) ```java public class Server { public static void main(String[] args) { try { // 创建ServerSocket对象,并指定端口号 int port = 8888; ServerSocket serverSocket = new ServerSocket(port); // 等待客户端连接 System.out.println("等待客户端连接..."); Socket socket = serverSocket.accept(); System.out.println("客户端已连接。"); // 获取输入流 InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); String content = new String(buffer, 0, len, "UTF-8"); System.out.println("接收到客户端的数据:" + content); // 处理数据 String response = "Hello, Android!"; // 获取输出流 OutputStream outputStream = socket.getOutputStream(); // 发送数据 outputStream.write(response.getBytes("UTF-8")); // 关闭Socket对象 socket.close(); serverSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在运行代码之前,需要确保Android设备和PC在同一个局域网中,并且知道PC的IP地址和端口号。如果PC的IP地址为192.168.1.100,端口号为8888,则Android设备需要将IP地址设置为192.168.1.100,端口号设置为8888。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值