如何将Android应用程序连接到python socketio后端?

如何将Android应用程序连接到python socketio后端?,android,python,flask,socket.io,Android,Python,Flask,Socket.io,我目前正在运行一个Python SocketIO服务器,它完美地连接到我的JavaScript客户端。我正在使用编写Android代码,它与NodeJS服务器完美配合,但当我改用Python服务器时,它将无法连接 如何从Android连接到Ptyhon SocketIO服务器? Android代码: public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemS

我目前正在运行一个Python SocketIO服务器,它完美地连接到我的JavaScript客户端。我正在使用编写Android代码,它与NodeJS服务器完美配合,但当我改用Python服务器时,它将无法连接

如何从Android连接到Ptyhon SocketIO服务器?

Android代码:

public class HomeActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private final String TAG = "MainActivity";

Button btnCore0, btnCore1, btnCPUUsage;
private ProgressBar progressBar;

private Socket mSocket;

{
    try {
        mSocket = IO.socket(Constants.SERVER_URL);
    } catch (URISyntaxException e) {
        Log.e(TAG, e.getMessage());
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    btnCore0 = (Button) findViewById(R.id.btnCore0);
    btnCore1 = (Button) findViewById(R.id.btnCore1);
    btnCPUUsage = (Button) findViewById(R.id.btnCPUUsage);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    // Make buttons invisible
    btnCore0.setVisibility(View.INVISIBLE);
    btnCore1.setVisibility(View.INVISIBLE);
    btnCPUUsage.setVisibility(View.INVISIBLE);
    // Make progress bar visible
    progressBar.setVisibility(View.VISIBLE);

    mSocket.on("status-update", onNewMessage);
    mSocket.on(Socket.EVENT_DISCONNECT, onSocketDisconnected);
    mSocket.connect();
}

private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        HomeActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "New message 090909***");
                JSONObject data = (JSONObject) args[0];
                int core0 = 0;
                int core1 = 0;
                int cpu_usage_in = 0;
                try {
                    core0 = data.getInt("core0_in");
                    core1 = data.getInt("core1_in");
                    cpu_usage_in = data.getInt("cpu_usage_in");
                } catch (JSONException e) {
                    Log.e(TAG, e.getMessage());
                }

                btnCore0.setText(getResources().getString(R.string.core0, String.valueOf(core0)));
                btnCore1.setText(getResources().getString(R.string.core1, String.valueOf(core1)));
                btnCPUUsage.setText(getResources().getString(R.string.cpu_usge, String.valueOf(cpu_usage_in)));

                updateButtonBackgroundColor(btnCore0, core0);
                updateButtonBackgroundColor(btnCore1, core1);
                updateButtonBackgroundColor(btnCPUUsage, cpu_usage_in);

                onServerDataReceived();
            }
        });
    }
};
from flask import Flask, render_template
from flask_socketio import SocketIO
from gcm import GCM

eventlet.monkey_patch()
app = Flask(__name__)
socket = SocketIO(app, logger=True, engineio_logger=True)

class Server(threading.Thread):
def __init__(self, thread_id):
    threading.Thread.__init__(self)
    self.threadID = thread_id

def run(self):
    print("Starting " + self.name)
    serve()
    print("Exiting " + self.name)


def serve():
if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.wrap_ssl(eventlet.listen(('', 8000)), certfile='/home/garthtee/cert.pem', keyfile='/home/garthtee/privkey.pem'), app)

server_thread = Server("Server-thread")
server_thread.start()
threads.append(server_thread)
print("Started @ " + str(get_time()))
while True:
sensors.init()
try:
    for chip in sensors.iter_detected_chips():
        # print('%s at %s' % (chip, chip.adapter_name))
        for feature in chip:
            if feature.label == 'Core 0':
                core0 = feature.get_value()
            elif feature.label == 'Core 1':
                core1 = feature.get_value()
    for x in range(1):
        cpu_usage = str(psutil.cpu_percent(interval=1))
finally:
    socket.emit('status-update', {'core0_in': core0, 'core1_in': core1, 'cpu_usage_in': cpu_usage, 'users': users})

    alert_checker(avg_temp, users)
    sensors.cleanup()
    time.sleep(1)
下一个是Pyhton服务器,它每秒钟发出一次数据。我知道这很好,因为我可以通过JavaScript应用程序连接到它。 Python代码:

public class HomeActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private final String TAG = "MainActivity";

Button btnCore0, btnCore1, btnCPUUsage;
private ProgressBar progressBar;

private Socket mSocket;

{
    try {
        mSocket = IO.socket(Constants.SERVER_URL);
    } catch (URISyntaxException e) {
        Log.e(TAG, e.getMessage());
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    btnCore0 = (Button) findViewById(R.id.btnCore0);
    btnCore1 = (Button) findViewById(R.id.btnCore1);
    btnCPUUsage = (Button) findViewById(R.id.btnCPUUsage);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    // Make buttons invisible
    btnCore0.setVisibility(View.INVISIBLE);
    btnCore1.setVisibility(View.INVISIBLE);
    btnCPUUsage.setVisibility(View.INVISIBLE);
    // Make progress bar visible
    progressBar.setVisibility(View.VISIBLE);

    mSocket.on("status-update", onNewMessage);
    mSocket.on(Socket.EVENT_DISCONNECT, onSocketDisconnected);
    mSocket.connect();
}

private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        HomeActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "New message 090909***");
                JSONObject data = (JSONObject) args[0];
                int core0 = 0;
                int core1 = 0;
                int cpu_usage_in = 0;
                try {
                    core0 = data.getInt("core0_in");
                    core1 = data.getInt("core1_in");
                    cpu_usage_in = data.getInt("cpu_usage_in");
                } catch (JSONException e) {
                    Log.e(TAG, e.getMessage());
                }

                btnCore0.setText(getResources().getString(R.string.core0, String.valueOf(core0)));
                btnCore1.setText(getResources().getString(R.string.core1, String.valueOf(core1)));
                btnCPUUsage.setText(getResources().getString(R.string.cpu_usge, String.valueOf(cpu_usage_in)));

                updateButtonBackgroundColor(btnCore0, core0);
                updateButtonBackgroundColor(btnCore1, core1);
                updateButtonBackgroundColor(btnCPUUsage, cpu_usage_in);

                onServerDataReceived();
            }
        });
    }
};
from flask import Flask, render_template
from flask_socketio import SocketIO
from gcm import GCM

eventlet.monkey_patch()
app = Flask(__name__)
socket = SocketIO(app, logger=True, engineio_logger=True)

class Server(threading.Thread):
def __init__(self, thread_id):
    threading.Thread.__init__(self)
    self.threadID = thread_id

def run(self):
    print("Starting " + self.name)
    serve()
    print("Exiting " + self.name)


def serve():
if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.wrap_ssl(eventlet.listen(('', 8000)), certfile='/home/garthtee/cert.pem', keyfile='/home/garthtee/privkey.pem'), app)

server_thread = Server("Server-thread")
server_thread.start()
threads.append(server_thread)
print("Started @ " + str(get_time()))
while True:
sensors.init()
try:
    for chip in sensors.iter_detected_chips():
        # print('%s at %s' % (chip, chip.adapter_name))
        for feature in chip:
            if feature.label == 'Core 0':
                core0 = feature.get_value()
            elif feature.label == 'Core 1':
                core1 = feature.get_value()
    for x in range(1):
        cpu_usage = str(psutil.cpu_percent(interval=1))
finally:
    socket.emit('status-update', {'core0_in': core0, 'core1_in': core1, 'cpu_usage_in': cpu_usage, 'users': users})

    alert_checker(avg_temp, users)
    sensors.cleanup()
    time.sleep(1)
出现以下错误:

public class HomeActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private final String TAG = "MainActivity";

Button btnCore0, btnCore1, btnCPUUsage;
private ProgressBar progressBar;

private Socket mSocket;

{
    try {
        mSocket = IO.socket(Constants.SERVER_URL);
    } catch (URISyntaxException e) {
        Log.e(TAG, e.getMessage());
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    btnCore0 = (Button) findViewById(R.id.btnCore0);
    btnCore1 = (Button) findViewById(R.id.btnCore1);
    btnCPUUsage = (Button) findViewById(R.id.btnCPUUsage);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    // Make buttons invisible
    btnCore0.setVisibility(View.INVISIBLE);
    btnCore1.setVisibility(View.INVISIBLE);
    btnCPUUsage.setVisibility(View.INVISIBLE);
    // Make progress bar visible
    progressBar.setVisibility(View.VISIBLE);

    mSocket.on("status-update", onNewMessage);
    mSocket.on(Socket.EVENT_DISCONNECT, onSocketDisconnected);
    mSocket.connect();
}

private Emitter.Listener onNewMessage = new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        HomeActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "New message 090909***");
                JSONObject data = (JSONObject) args[0];
                int core0 = 0;
                int core1 = 0;
                int cpu_usage_in = 0;
                try {
                    core0 = data.getInt("core0_in");
                    core1 = data.getInt("core1_in");
                    cpu_usage_in = data.getInt("cpu_usage_in");
                } catch (JSONException e) {
                    Log.e(TAG, e.getMessage());
                }

                btnCore0.setText(getResources().getString(R.string.core0, String.valueOf(core0)));
                btnCore1.setText(getResources().getString(R.string.core1, String.valueOf(core1)));
                btnCPUUsage.setText(getResources().getString(R.string.cpu_usge, String.valueOf(cpu_usage_in)));

                updateButtonBackgroundColor(btnCore0, core0);
                updateButtonBackgroundColor(btnCore1, core1);
                updateButtonBackgroundColor(btnCPUUsage, cpu_usage_in);

                onServerDataReceived();
            }
        });
    }
};
from flask import Flask, render_template
from flask_socketio import SocketIO
from gcm import GCM

eventlet.monkey_patch()
app = Flask(__name__)
socket = SocketIO(app, logger=True, engineio_logger=True)

class Server(threading.Thread):
def __init__(self, thread_id):
    threading.Thread.__init__(self)
    self.threadID = thread_id

def run(self):
    print("Starting " + self.name)
    serve()
    print("Exiting " + self.name)


def serve():
if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.wrap_ssl(eventlet.listen(('', 8000)), certfile='/home/garthtee/cert.pem', keyfile='/home/garthtee/privkey.pem'), app)

server_thread = Server("Server-thread")
server_thread.start()
threads.append(server_thread)
print("Started @ " + str(get_time()))
while True:
sensors.init()
try:
    for chip in sensors.iter_detected_chips():
        # print('%s at %s' % (chip, chip.adapter_name))
        for feature in chip:
            if feature.label == 'Core 0':
                core0 = feature.get_value()
            elif feature.label == 'Core 1':
                core1 = feature.get_value()
    for x in range(1):
        cpu_usage = str(psutil.cpu_percent(interval=1))
finally:
    socket.emit('status-update', {'core0_in': core0, 'core1_in': core1, 'cpu_usage_in': cpu_usage, 'users': users})

    alert_checker(avg_temp, users)
    sensors.cleanup()
    time.sleep(1)

SSLError:[SSL:SSL\u握手失败]SSL握手失败(\u SSL.c:1754)

我从

我对示例代码进行了如下修改:

import socketio
import eventlet
import eventlet.wsgi
from flask import Flask, render_template

sio = socketio.Server()
app = Flask(__name__)

@app.route('/')
def index():
    """Serve the client-side application."""
    return render_template('index.html')

@sio.on('connect', namespace='/')
def connect(sid, environ):
    print("connect ", sid)

@sio.on('add user', namespace='/')
def login(sid, environ):
    print("login ", sid)
    sio.emit('login', room=sid)

@sio.on('new message', namespace='/')
def message(sid, data):
    print("message ", data)
    sio.emit('reply', room=sid)

@sio.on('disconnect', namespace='/')
def disconnect(sid):
    print('disconnect ', sid)

if __name__ == '__main__':
    # wrap Flask application with engineio's middleware
    app = socketio.Middleware(sio, app)

    # deploy as an eventlet WSGI server
    eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
然后我克隆了这个项目,我在Constants.java中唯一更改的是:

public static final String CHAT_SERVER_URL = "http://MY_LOCAL_IP:8000";
Android应用程序可以连接。 我在应用程序和python控制台中看到了它。 如果删除一些不必要的解析部分(应用程序正在崩溃,因为响应不同),您还可以在python中看到您的消息

您是否尝试先在没有SSL的情况下运行服务器应用程序

也许这就是问题所在。
在Android上,您可以使用
IO.setDefaultSSLContext(SSLContext SSLContext)
来设置SSL。

我尝试过使用这个socket.IO-client-java,但无法连接到它。当我使用NodeJS后端时,它可以完美地工作,但不能与Python一起工作。也许Python后端需要更改某些内容?是否使用相同的SocketIO版本?谢谢,我修改了答案@Garth你能在没有SSL的情况下试试吗?检查这个:,挑战#2:信任自签名服务器证书我也发现了一个问题,如果有人到了这里:你需要准确地解释你所说的“它无法连接”是什么意思。服务器是否完全忽略了Android应用程序,例如,如果服务器url错误,会发生什么?服务器会发出ok消息,但Android应用程序不会收到它。我有上面的Android代码,自从我运行一个NodeJS服务器以来,我没有更改它,连接就可以正常工作。我还收到了一个SSL握手错误,也许这是我的问题?