使用websocket

时间:2017-04-22 12:24:59

标签: java android python

我正在尝试使用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();
    }
}
}

消息“我正在监听端口:”后没有系统输出。

1 个答案:

答案 0 :(得分:0)

客户端未将消息发送到服务器/主机进程。这是因为启用PrintWriter的{​​{1}}仅在调用autoFlushprintlnprintf方法之一时才刷新输出流。这排除了format方法。请参阅PrintWriter

另一种选择是通过在write之后调用flush方法或通过在关闭套接字之前关闭输出流来显式刷新输出:

write

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