使用websocket时无法通过java执行python脚本

问题描述:

我想用android应用程序来控制我的树莓pi。我使用websocket来做到这一点。作为测试,我只想从app(客户端)发送输出消息到主机(pi),它将执行一个python脚本。我无法让python脚本执行。 这里是我的代码:使用websocket时无法通过java执行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(); 
    } 
} 
} 

有消息后没有系统输出“我在听在港口:“。

客户端不会将消息发送到服务器/主机进程。这是因为0123B和autoFlush启用时,只有在调用println,printfformat方法中的一个时才会刷新输出流。这不包括write方法。见PrintWriter

另一种选择是,或者通过关闭套接字之前关闭输出流通过调用writeflush方法明确地刷新输出:

private void test() { 
    try { 

     Socket socket = new Socket(add, port); 
     PrintWriter output = new PrintWriter(socket.getOutputStream(), true); 
     output.write("test"); 
     output.flush(); # or output.close(); 
     socket.close(); 

    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 

您可能需要一些更多的调试信息添加到您的主机码;首先要确保客户端实际连接到服务器,显示传入的消息,并检查子进程的结果。