Python(服务器)从Java(客户端)接收数据。 - java

好的,所以我读了很多问题,无法解决。我从Android应用程序接收到的数据面临问题。基本上我想控制一个伺服器。该代码有效,但是应用发送到服务器的数据在单独的行中接收。是的,我知道我需要使用缓冲区,我做了一些研究,但找不到找到在我的代码中添加缓冲区的方法。
另外,我认为我不需要显示Java代码,因为它只是从按钮单击发送的基本命令(如Up,Down等字符串)。

...Python Code(Server)...
  ctrCmd = ['Up','Down', 'ON', 'OFF']
  ...
  ...
  while True:
        print ("Waiting for connection")
        tcpCliSock,addr = tcpSerSock.accept()
        print ("...connected from :", addr)

    try:
            while True:
                    data = ''
                    data = tcpCliSock.recv(BUFSIZE).decode()
                    print("This",data)

                    if not data:
                            print ("No Data",data)
                            break
                    if data == ctrCmd[0]:
                            print("I am here")
                            Servomotor.ServoUp()
                            print ("Increase: ",Servomotor.cur_X)
                            #tcpCliSock.send("Servo Increases".encode())
                    if data == ctrCmd[1]:
                            Servomotor.ServoDown()
                            print ("Decrease: ",Servomotor.cur_X)
                            #tcpCliSock.send("Servo Decreases".encode())
                    if data == ctrCmd[2]:
                            Servomotor.ledOn()
                            print ("Led On")
                            #tcpCliSock.send("Led On".encode())
                    if data == ctrCmd[3]:
                            Servomotor.ledOff()
                            print ("Led Off")
                           # tcpCliSock.send("Led Off".encode())
    except KeyboardInterrupt:
            Servomotor.close()
            GPIO.cleanup()
tcpSerSock.close();

Python(服务器)从Java(客户端)接收数据。 - java

我也不明白为什么即使显示接收到的数据也说没有数据?
请帮助我真的是菜鸟,正在尝试学习。
谢谢!!

更新!
在我更改了decode()建议后,

Python(服务器)从Java(客户端)接收数据。 - java

    public class MainActivity extends AppCompatActivity {
    //UI Element
    Button btnUp;
    Button btnDown;
    Button btnLedOn;
    Button btnLedOff;
    EditText txtAddress;
    /*TextView message;*/
    Socket myAppSocket = null;
    public static String wifiModuleIp = "";
    public static int wifiModulePort = 0;
    public static String CMD = "0";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnUp = (Button) findViewById(R.id.btnUp);
        btnDown = (Button) findViewById(R.id.btnDown);
        btnLedOn = (Button) findViewById(R.id.btnLedOn);
        btnLedOff = (Button) findViewById(R.id.btnLedOff);
        txtAddress = (EditText) findViewById(R.id.ipAddress);
        /*message = (TextView) findViewById(R.id.message);*/

        btnUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIPandPort();
                CMD = "Up";
                Socket_AsyncTask cmd_increase_servo = new Socket_AsyncTask();
                cmd_increase_servo.execute();
            }
        });
        btnDown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIPandPort();
                CMD = "Down";
                Socket_AsyncTask cmd_increase_servo = new Socket_AsyncTask();
                cmd_increase_servo.execute();
            }
        });
        btnLedOn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIPandPort();;
                CMD = "ON";
                Socket_AsyncTask cmd_led_on = new Socket_AsyncTask();
                cmd_led_on.execute();
            }
        });
        btnLedOff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIPandPort();
                CMD = "OFF";
                Socket_AsyncTask cmd_led_off = new Socket_AsyncTask();
                cmd_led_off.execute();
            }
        });

    }
    public void getIPandPort()
    {
        String iPandPort = txtAddress.getText().toString();

        Log.d("MYTEST","IP String: "+ iPandPort);
        String temp[]= iPandPort.split(":");
        wifiModuleIp = temp[0];
        wifiModulePort = Integer.valueOf(temp[1]);
        Log.d("MY TEST","IP:" +wifiModuleIp);
        Log.d("MY TEST","PORT:"+wifiModulePort);
    }
    public class Socket_AsyncTask extends AsyncTask<Void,Void,Void>
    {
        Socket socket;

        @Override
        protected Void doInBackground(Void... params){

            try{

                InetAddress inetAddress = InetAddress.getByName(MainActivity.wifiModuleIp);
                socket = new java.net.Socket(inetAddress,MainActivity.wifiModulePort);
                //read input msg from server

                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataOutputStream.writeBytes(CMD);
                System.out.println(CMD);
                dataOutputStream.close();

                socket.close();
            }catch (UnknownHostException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}
            return null;
        }
    }
}

Android代码的输出
Python(服务器)从Java(客户端)接收数据。 - java

5月17日更新
我试过了writeUTF,它在Up之前给出了一些空数据(参见图片)
Python(服务器)从Java(客户端)接收数据。 - java

参考方案

试试看:

socket = new java.net.Socket(inetAddress,MainActivity.wifiModulePort);
//read input msg from server
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeChars(CMD);
System.out.println(CMD);
dataOutputStream.close();

socket.close();

如果这增加了额外的空间,那么简单的解决方案将是继续使用writeutf并在服务器端对数据进行子字符串化

socket =新的java.net.Socket(inetAddress,MainActivity.wifiModulePort);

//read input msg from server
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(CMD);
System.out.println(CMD);
dataOutputStream.close();

socket.close();

在服务器端:

data = tcpCliSock.recv(BUFSIZE).decode()
data = data[2:]

引用Javadoc:

  使用修改后的UTF-8将字符串写入基础输出流
  以与机器无关的方式进行编码。
  
  首先,将两个字节写入输出流,就像
  writeShort方法给出了要跟随的字节数。这个值是
  实际写出的字节数,而不是长度
  串。按照长度,输出字符串的每个字符,
  按顺序,对字符使用修改后的UTF-8编码。如果
  没有引发异常,写入的计数器将增加
  写入输出流的字节总数。这将在
  至少两个加上str的长度,并且最多两个加上三次
  长度

从Java(Tomcat6)调用Python作为子过程 - java

我正在尝试从java / tomcat6 webapp调用python脚本。我目前正在使用以下代码: Process p = Runtime.getRuntime().exec("python <file.py>"); InputStream in = p.getInputStream(); InputStreamReader…

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

python-构造函数中的另一个类 - java

我是Python的新手,我很难理解如何在Python中执行以下操作(例如,在Java中的操作方式)class Person{ private String name; private Address address; public Person(String xyz, Address a) { this.name = xyz; this.address = …

如何从Java执行python脚本? - java

我有一个python脚本,需要从Java运行python脚本。这该怎么做? 参考方案 一种选择是使用jython(用Java编写的Python)。如果不合适,则可以使用Runtime.exec()派生/执行脚本过程。但是,使用它可能有点麻烦,请查看this article中常见的陷阱。

Java内部不整洁? - java

是否可以在Java项目中使用Scrapy?以Jython为例,或者也许是“间接”解决方案。 参考方案 我怀疑您可以在jython下运行扭曲,而scrapy是基于扭曲的。不确定要做什么,但是我建议运行scrapyd并使用Web服务接口与Java进行通信。您能为我们提供您想要实现的更多详细信息吗?