Я создал 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, поэтому, когда я нажимаю на нее, что-то будет печататься в терминале, но это не работает .. ¨
Спасибо.