#java #python #websocket
Вопрос:
Для школьного проекта я должен заставить raspberry pi отправлять данные датчиков в java-приложение с помощью websockets. На raspberry pi работает сервер websocket и клиентский скрипт. Оба этих сценария написаны на python. Мне удалось заставить сервер и клиент java и python работать. Проблема, с которой я сталкиваюсь, заключается в том, что при отправке данных он будет получать только свои собственные данные. Поэтому, когда скрипт python отправляет данные на сервер, сервер печатает данные и отправляет их обратно клиенту python, а клиент python печатает их. Когда клиент java отправляет данные на сервер, сервер печатает данные и отправляет их обратно в приложение java, а приложение java печатает их, но скрипт python не печатает данные. Что я делаю не так?
Server.py
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
print(message)
await websocket.send(message)
start_server = websockets.serve(echo, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Client.py
import asyncio
import websockets
from time import sleep
from datetime import datetime
async def hello():
uri = "ws://localhost:8765"
async with websockets.connect(uri) as websocket:
await websocket.send(datetime.now().strftime("%H:%M:%S"))
while (True):
# Dit ontvangt een bericht van de server en print het
msg = await websocket.recv()
print(msg)
asyncio.get_event_loop().run_until_complete(hello())
ExampleClient.java
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.handshake.ServerHandshake;
import static java.lang.Thread.sleep;
/**
* This example demonstrates how to create a websocket connection to a server. Only the most
* important callbacks are overloaded.
*/
public class ExampleClient extends WebSocketClient {
public ExampleClient(URI serverUri, Draft draft) {
super(serverUri, draft);
}
public ExampleClient(URI serverURI) {
super(serverURI);
}
public ExampleClient(URI serverUri, Map<String, String> httpHeaders) {
super(serverUri, httpHeaders);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
send("Hello, it is me. Mario :)");
}
@Override
public void onMessage(String message) {
System.out.println("received: " message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
// The codecodes are documented in class org.java_websocket.framing.CloseFrame
System.out.println(
"Connection closed by " (remote ? "remote peer" : "us") " Code: " code " Reason: "
reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
// if the error is fatal then onClose will be called additionally
}
}
public class Main {
public static void main(String[] args) throws URISyntaxException {
ExampleClient c = new ExampleClient(new URI(
"ws://localhost:8765")); // more about drafts here: http://github.com/TooTallNate/Java-WebSocket/wiki/Drafts
c.connect();
}
}
(Для тестирования все сценарии запускаются на одном компьютере)
Комментарии:
1. Вы должны вести список всех подключенных клиентов и отправлять сообщения всем им.
2. Когда вы говорите «но скрипт python не печатает данные», вы говорите о клиенте python или сервере python?