клиент сокета totp kotlin не работает сервер питона - PullRequest
0 голосов
/ 31 августа 2018

Я хочу создать приложение, которое будет подключаться к моему серверу python с помощью сокетов.

Когда я нажимаю кнопку подключения, она даже не печатает полученное соединение на моем PS, пожалуйста, помогите. Спасибо

У меня есть следующий базовый код в kotlin:

//Kotlin Code

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Toast
import java.io.DataOutputStream
import java.net.Socket

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.start_page)

    fun connect(v : View) {
        try{
            val soc = Socket("192.168.1.5", 1419)
            val dout = DataOutputStream(soc.getOutputStream())
            dout.writeUTF("1")
            dout.flush()
            dout.close()
            soc.close()
        }
        catch (e:Exception){
            e.printStackTrace()
        }
    }

}

Функция подключения активируется при нажатии на кнопку, это код xml для моего начального экрана

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/connect"
        android:layout_width="108dp"
        android:layout_height="50dp"
        android:layout_marginBottom="127dp"
        android:layout_marginEnd="228dp"
        android:layout_marginStart="256dp"
        android:onClick="connect"
        android:text="@string/connect"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</android.support.constraint.ConstraintLayout>

и это мой код на сервере Python:

#Python code 

import socket

s = socket.socket()
s.bind(('0.0.0.0', 1419))
s.listen(5)

c, addr = s.accept()
print ('Got connection from', addr)
code_encoded = c.recv(1024)
code_decoded = code_encoded.decode('utf-8')
print(code_decoded)
c.close()
s.close()

1 Ответ

0 голосов
/ 05 сентября 2018

Я исправил это, внедрив asynctask в свою функцию и использовал java вместо kotlin, но он должен работать аналогично и в kotlin.

Функция теперь такая,

class ServerConnection extends AsyncTask<MainActivity.ConnParams, Void, Void> {

    @Override
    protected Void doInBackground(MainActivity.ConnParams... params)
    {
        String ip = params[0].ip;
        int port = params[0].port;
        String message = params[0].message;
        try
        {
            Socket socket = new Socket(ip, port);
            PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
            printWriter.write(message);
            printWriter.flush();
            printWriter.close();
            socket.close();
        } catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }
}

Несмотря на то, что asynctask не подходит для задач, где вам нужно, чтобы она оставалась в фоновом режиме в течение более длительных периодов времени, в это время я бы рекомендовал использовать службы Android .

...