簡體   English   中英

Sockets 從 Java 到 Python 並再次返回

[英]Sockets from Java to Python and back again

是否可以通過應用程序從 Android 手機與 Raspberry Pi 進行通信? 我已經嘗試並成功地將信息從 Android 應用程序發送到 RaspberryPi。 但是當我嘗試通過調用phoneServer.connect(addr)從 RPi 連接到手機時,python 只是超時。 那么是否可以從 Python Socket 向 Java Socket 發送命令?

Initialy I had one socket in the python script and I just used tcpCliSock.sendto(data.encode(),addr) to try and send the command to the java socket, but that resulted in a broken pipe errer (32), so I以為我可以通過創建一個新的套接字來解決它,但它並沒有解決這個問題。

我目前嘗試在 Python 和 Java 中設置 sockets。 Python(在 RPi 上)中的那些看起來像這樣:

HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

PORTSEND = 7801
while True:
    print('Waiting for connection')
    tcpCliSock,addr = tcpSerSock.accept()
    data = ''
    print('...connected from :', addr)
    try:
        while True:
            d = tcpCliSock.recv(BUFSIZE)
            data = data + d.decode("utf-8")
            print(data)    
            if data == 'XButton':
                print('XButton Pressed')
                lst = list(addr)
                lst[1] = PORTSEND
                addr = tuple(lst)
                phoneServer = socket(AF_INET, SOCK_STREAM)
                phoneServer.connect(addr)
                phoneServer.send(data.encode())
                phoneServer.close()
                break
            else:
                if not d:
                    break
    except KeyboardInterrupt:
        print('keyboard pressed')

tcpSerSock.close()

Java(在 Android 上)中的那些看起來像這樣:

public class MainActivity extends AppCompatActivity  {
    EditText iPField;
    Button xButton;
    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);

        Thread myThread = new Thread(new MyServerThread());
        myThread.start();

        iPField = (EditText) findViewById(R.id.IPEditField);
        xButton = (Button) findViewById(R.id.XButton);

        xButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIPandPort();
                CMD = "XButton";
                Socket_AsyncTask cmd_verify = new Socket_AsyncTask();
                cmd_verify.execute();
            }
        });

    public void getIPandPort()
    {
        String iPandPort = iPField.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);
                DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                dataOutputStream.writeBytes(CMD);
                dataOutputStream.close();
                socket.close();
            }catch (UnknownHostException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}
            return null;
        }
    }

    class MyServerThread implements Runnable
    {
        Socket s;
        ServerSocket ss;
        InputStreamReader isr;
        BufferedReader bufferedReader;
        String message;
        Handler h = new Handler();

        @Override
        public void run() {
            try
            {
                ss = new ServerSocket(7801);
                while(true)
                {
                    s = ss.accept();
                    isr = new InputStreamReader(s.getInputStream());
                    bufferedReader = new BufferedReader(isr);
                    message = bufferedReader.readLine();

                    h.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),message,Toast.LENGTH_SHORT).show();
                        }
                    });

                }

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

我使用用於 html 檢索的此類任務准備庫。

例如,在 Android 上存在 org.apache.http.client (現在他們推薦更新的庫,但舊的仍然可以正常工作)。 And Python also have http client in standard library https://docs.python.org/3/library/http.client.html

它既方便又節省大量時間,為一般任務重用一些現成的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM