Попытка сделать так, чтобы мой скрипт на python отправлял сообщение java-программе в Android-студиях через сокеты, но это не работает? - PullRequest
0 голосов
/ 02 октября 2018

Я хочу отправить сообщение из моего скрипта Python в мою Java-программу и показать его через мобильный эмулятор.

Вот мой код Python:

import socket

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 1095
ip = "192.168.1.104"
clientsocket.connect((ip, port))
clientsocket.send('HELLO FROM PYTHON!!'.encode())
clientsocket.close()

Я могуотправить сообщение "ПРИВЕТ ОТ ПИТОНА !!"к java-программе в eclipse просто отлично, но я не могу на всю жизнь отправить ее в java-программу на Android Studios.

Вот основная программа действий:

public class MainActivity extends AppCompatActivity {

private TextView mTextView;
private ServerSocket serverSocket;
Handler updateConversationHandler;
Thread serverThread = null;
TextView message;

public static final int port = 1095;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.text);
    // Enables Always-on
    //setAmbientEnabled();
    message = (TextView) findViewById(R.id.message);
    updateConversationHandler = new Handler();
    this.serverThread = new Thread(new ServerThread());
    this.serverThread.start(); // THIS WILL ACCEPT A MESSAGE FROM PYTHON CLIENT
}

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ServerThread implements Runnable {
    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(port);
            message.setText("successfully created");
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {
            try {
                message.setText("Waiiting..."); // WAITING FOR IT TO ACCEPT
                socket = serverSocket.accept(); // IT GETS STUCK HERE
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
                message.setText("error");
            }
        }
    }

}


class CommunicationThread implements Runnable {
    private Socket clientSocket;
    private BufferedReader input;
    public CommunicationThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
        try {
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                String read = input.readLine();
                updateConversationHandler.post(new updateUIThread(read));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

class updateUIThread implements Runnable {
    private String msg;

    public updateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public void run() {
        message.setText(message.getText().toString()+"Client Says: "+ msg + "\n"); // THIS IS SUPPOSE TO BE DISPLAYED
    }
}


}

Вот кобылафайлы манифеста:

<?xml version="1.0" encoding="utf-8"?>

<uses-feature android:name="android.hardware.type.watch" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@android:style/Theme.DeviceDefault">
    <uses-library
        android:name="com.google.android.wearable"
        android:required="true" />
    <!--
           Set to true if your app is Standalone, that is, it does not require the handheld
           app to run.
    -->
    <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="true" />

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Проблема в том, что программа застряла в serverSocket.accept () метода run () на сервереПоток, потому что он не может достичь моей программы на Python.Мой эмулятор отображает «Waiiting», а не «Client Says: Hello From Python !!».Там нет ошибки, клиентский сокет Python просто не может достичь моего сокета сервера в Android-студиях.Я попытался использовать все IP-адреса (один из них на Wi-Fi моего компьютера, один отображался на IP-адресе wifi эмулятора телефона и ip, который печатается при использовании wifi-менеджера).

В основном: мой код Python не может быть подключен к моему коду Android Studios, но мой код Python может быть подключен к моему коду Eclipse, и я не знаю почему.

Что мне делать?

...