从运行在raspberry pi上的python向android发送字符串数据的问题

2024-10-03 19:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个字符串从raspberry pi发送到android设备。下面是我在android端的代码

package com.example.videostreamer;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private Socket s;

    private boolean mconnectexception = false;
    private static final String TAG = "MainActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        frame2video f2v = new frame2video();
        f2v.execute();
    }


    public class frame2video extends AsyncTask<Void, Void, Void> {

        protected void onPreExecute() {


        }

        protected Void doInBackground(Void... params) {
            BufferedReader dis;
            String message;

            try {
                s = new Socket("192.168.0.132", 5001);

                Log.d(TAG, "Connection Successful..!");

            } catch (IOException e) {
                e.printStackTrace();
                mconnectexception = true;
            }


            if (mconnectexception) {
                Log.d(TAG, "Connection not Available");
            }


            while (true) {
                try {
                    if (s!=null) {
                        dis = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf8"));
                        message = dis.readLine();
                        Log.d(TAG, "Here is it"+message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.d(TAG,"Something is wrong");
                }

                return null;
            }
        }


    }
}

在Raspberry pi方面,Python代码如下所示:

import socket
import time
import base64
from socket import gethostbyname, gethostname

listensocket=socket.socket()
Port=5001
maxConnections=999
IP=socket.gethostname()
print(IP)
listensocket.bind(('',Port))
listensocket.listen(maxConnections)
print('Server started at '+IP+' on Port'+str(Port))
(clientsocket,address)=listensocket.accept()
print("New Connection Made: "+str(address))
#listensocket.close()
running=True
times=1
while running:
    time.sleep(3)
    msg="The time is\n"
    print(msg)

    listensocket.send(bytes(msg,"utf-8"))
    times+=1
    if (times==30):
        running=False
        #listensocket.close()

#listensocket.close()

在Android端,日志如下(没有显示任何错误)

2019-10-08 23:22:32.884 7650-7650/? I/e.videostreame: Not late-enabling -Xcheck:jni (already on)
2019-10-08 23:22:32.934 7650-7650/? W/e.videostreame: Unexpected CPU variant for X86 using defaults: x86
2019-10-08 23:22:33.501 7650-7650/com.example.videostreamer W/e.videostreame: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2019-10-08 23:22:33.501 7650-7650/com.example.videostreamer W/e.videostreame: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2019-10-08 23:22:33.555 7650-7677/com.example.videostreamer D/MainActivity: Connection Successful..!
2019-10-08 23:22:33.559 7650-7650/com.example.videostreamer D/OpenGLRenderer: Skia GL Pipeline
2019-10-08 23:22:33.612 7650-7679/com.example.videostreamer I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-10-08 23:22:33.613 7650-7679/com.example.videostreamer I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2019-10-08 23:22:33.613 7650-7679/com.example.videostreamer I/OpenGLRenderer: Initialized EGL, version 1.4
2019-10-08 23:22:33.613 7650-7679/com.example.videostreamer D/OpenGLRenderer: Swap behavior 1
2019-10-08 23:22:33.613 7650-7679/com.example.videostreamer W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2019-10-08 23:22:33.613 7650-7679/com.example.videostreamer D/OpenGLRenderer: Swap behavior 0
2019-10-08 23:22:33.615 7650-7679/com.example.videostreamer D/EGL_emulation: eglCreateContext: 0xe4f85180: maj 3 min 0 rcv 3
2019-10-08 23:22:33.616 7650-7679/com.example.videostreamer D/EGL_emulation: eglMakeCurrent: 0xe4f85180: ver 3 0 (tinfo 0xe4f83680)
2019-10-08 23:22:33.706 7650-7679/com.example.videostreamer D/EGL_emulation: eglMakeCurrent: 0xe4f85180: ver 3 0 (tinfo 0xe4f83680)

在python方面,我成功地创建了连接,但有一行:

listensocket.send(bytes(msg,"utf-8")

我得到一个坏管道错误:[Err 32]坏管道。Java日志中没有其他内容

我是Java方面的新手,可能会犯一些愚蠢的错误……:( 任何帮助都会很好


Tags: ioimportcomlognewexampletagsocket
1条回答
网友
1楼 · 发布于 2024-10-03 19:24:02

根据socket.accept()上的docs

The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection

你需要改变

listensocket.send(...

clientsocket.send(...

我测试了它,三次尝试后它就超时了(我没有侦听器),但是第一个版本在第一次.send(...时立即崩溃

相关问题 更多 >