我正在尝试使用Android应用程序控制我的覆盆子pi。我正在使用websocket来做到这一点。作为测试,我只想从app(客户端)向将执行python脚本的主机(pi)发送输出消息。我无法让python脚本执行。 这是我的代码:
host.java
import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.IOException;
public class host{
public static void main(String args[]){
try(ServerSocket serverSocket = new ServerSocket(4141)) {
System.out.println("I'm listening on port: " +serverSocket.getLocalPort());
while (true) {
try {
Socket socket = serverSocket.accept();
OutputStream output = socket.getOutputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String in = "";
while ((in = input.readLine()) != null){
System.out.println("Message Received: " + in);
if(in.equals("test")){
Process p = Runtime.getRuntime().exec("python test.py");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是我的Android应用程序代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.*;
import java.net.*;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
String add = "192.168.100.7";
int port = 4141;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button test = (Button)findViewById(R.id.test);
test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
test();
}
});
private void test() {
try {
Socket socket = new Socket(add, port);
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
output.write("test");
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
消息“我正在监听端口:”后没有系统输出。
答案 0 :(得分:0)
客户端未将消息发送到服务器/主机进程。这是因为启用PrintWriter
的{{1}}仅在调用autoFlush
,println
或printf
方法之一时才刷新输出流。这排除了format
方法。请参阅PrintWriter
。
另一种选择是通过在write
之后调用flush
方法或通过在关闭套接字之前关闭输出流来显式刷新输出:
write
您可能希望在主机代码中添加更多调试消息;首先要确保客户端实际连接到服务器,显示传入的消息,并检查子进程的结果。