Kotlin TCP套接字客户端无法正常工作的Python服务器

时间:2018-08-31 13:32:37

标签: python-3.x sockets server kotlin client

我想制作一个使用套接字连接到我的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 :(得分:0)

我通过在函数中实现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 services