需求
通过
adb forward tcp:localport tcp:remoteport
进行端口转发,实现
PC(客户端)
与
Android(服务端)
进行
Socket
通信
PC端
PC端
使用的是
JavaFX
编写的界面,在其
Controller
中的代码是:
public class ImageController {
public void onButtonClicked(ActionEvent event) {
try {
Runtime.getRuntime().exec("adb forward tcp:10000 tcp:20000");
Socket client = new Socket(InetAddress.getByName("127.0.0.1"), 10000);
// 向服务端发送消息: hello
OutputStream out = client.getOutputStream();
out.write("hello".getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Android服务端
/**
接收客户端
*/
public class PCService extends Service {
private static final int SERVER_PORT = 20000;
@Override
public void onCreate() {
super.onCreate();
new Thread(() -> doListening()).start();
}
private void doListening() {
try {
ServerSocket server = new ServerSocket(SERVER_PORT);
Log.i(TAG, "服务器监听中....");
Socket client = server.accept();
new Thread(new SocketIO(client)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SocketIO 客户端连接成功后,进行处理的类,继承Runnable
class SocketIO implements Runnable {
private Socket mClient;
public SocketIO(Socket client) {
mClient = client;
}
@Override
public void run() {
if (mClient.isConnected()) {
try {
// 接收客户端发来的消息
InputStream in = mClient.getInputStream();
Scanner scan = new Scanner(in);
scan.useDelimiter("\\A");
String msg = scan.hasNext() ? scan.next() : "暂无";
System.out.println("接收到的数据: " + msg);
switch (msg) {
case "hello":
// TODO: doSomething();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
Log.i(TAG, "客户端未连接");
}
}
}
问题
PC端,
out.flush()
之后不写任何东西是,点击按钮,Android服务端没有任何显示,当关闭PC端应用程序时, Android服务端显示 -> 接收到数据: hello
当
out.flush()
之后添加
client.shutdownOutputStream()
后, Android服务端显示 -> 接收到数据: 暂无 (意思就是没有收到PC端发来的消息)
想要得到的帮助
如何解决上面的通信问题? PC端发送一条消息给Android端, Android根据消息内容作出响应返回给PC端?