Соедините веб-сокет Python (aiohttp) с Android SocketIO lib - PullRequest
0 голосов
/ 03 ноября 2019

Я создал websocket на python, используя библиотеку AioHttp (работает отлично).

Также я создал простое приложение для Android, которое использует библиотеку SocketIO, которую я хочу использовать для подключения к веб-сокету.

Подключение к веб-сокету уже работает довольно хорошо, при подключении к нему через веб-браузер терминал выводит сообщение «Кто-то подключен к серверу!»каждый раз, когда кто-то набирает IP-адрес в браузере и подключается. Ниже мой код Python:

from aiohttp import web
import socketio
import aiohttp_cors

# creates a new Async Socket IO Server
sio = socketio.AsyncServer()
# Creates
app = web.Application()

sio.attach(app)

async def index(request):
    with open('index.html') as f:
        print("Somebody entered the server from the browser!")
        return web.Response(text=f.read(), content_type='text/html')



@sio.on('message')
async def print_message(sid, message):
    # When we receive a new event of type
    # 'message' through a socket.io connection
    # we print the socket ID and the message
    print("Socket ID: " , sid)
    print(message)

# We bind our aiohttp endpoint to our app
# router
cors = aiohttp_cors.setup(app)
app.router.add_get('/', index)

# We kick off our server
if __name__ == '__main__':
    web.run_app(app)

Вот мой файл index.html, чтобы я мог подключиться к сокету через веб-браузер (работает отлично):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <button onClick="sendMsg()">Hit Me</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
    <script>
      const socket = io("http://142.93.58.172:8080");

      function sendMsg() {
        socket.emit("message", "HELLO WORLDDDDDDDD");
      }
    </script>
  </body>
</html>

На моем AndroidПриложение, я попытался отладки, заставляя ошибки, чтобы убедиться, что проблема на стороне Android на стороне сервера. Например, если я меняю переменную url в приложении на «https: // ...» вместо «http: // ...», а затем подключаю приложение, и в терминале возникает ошибканедопустимая ошибка HTTP.

Так что я думаю, что нужно сделать на стороне сервера, чтобы «понять», что соединение исходит из приложения, а не из простого файла index.html.

Например, вот код в моем приложении для Android:

public class SecondActivity extends AppCompatActivity {
    public static final String CHAT_SERVER_URL = "http://142.93.58.172:8080";
    private Socket mSocket;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            mSocket = IO.socket(CHAT_SERVER_URL);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }

        setContentView(R.layout.activity_second);

        wannaBeChatApplication app = (wannaBeChatApplication) getApplication();
        mSocket = app.getSocket();

        Button startWebSocketBtn = (Button) findViewById(R.id.startWebSocketBtn);
        startWebSocketBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSocket.connect();
                Toast.makeText(SecondActivity.this, "This button got clicked!", Toast.LENGTH_SHORT).show();
                String message = "lol";
                mSocket.connect();
                mSocket.emit("lol", message);
                mSocket.connect();

            }
        });

    }
}

Итак, вопрос, как я могу заставить сервер «понять», что соединение исходит от устройства Android? Как вы можете видеть в коде, я попытался сделать кнопку так же, как это делается в index.html, поэтому, когда я нажимаю на нее, что-то будет печататься в терминале, но это не работает .. ¨

Спасибо.

...