実現したいこと
図形(たくさんの点)が動くシミュレーションをウェブサイト上で閲覧できるようにしたいです。
サーバー側では、1秒ごとのすべての点の座標が含まれるCSVファイルを読み込み、クライアントに毎秒データを送信します。そして、クライアント側でデータを表示します。
また、リアルタイムな反映を実現するために、サーバー側で操作を行い、接続中のクライアントに適切なタイミングで応答を返したいと考えています。
教えていただきたいこと
Web系はほぼ初めてですので、まずこの実現は厳しいものなのか、また使用するべきライブラリはなんなのかを教えていただきたいです。
試したこと
主にPythonでtornadaとflask sokcketIOを試したのですが、思い通りに動いてくれないです。
追記
Consoleのエラーログには
(index):12 Uncaught TypeError: columnData.join is not a function
at socket.onmessage ((index):12:35)
12の数字が1秒ごとに増えていきます。
最初にLoadingだけ表示され、そこから何も変わらないです。
一番マシに動いてくれたtornadaのコードを記載しておきます。
正直、tornadaで実現可能なのかもわからない状態です。
該当のソースコード
python
1import tornado.ioloop 2import tornado.web 3import tornado.websocket 4import tornado.gen 5import csv 6 7def readcsv(): 8 csv_file_path = "data.csv" 9 10 data = [] 11 with open(csv_file_path, "r", encoding='utf-8') as file: 12 reader = csv.reader(file) 13 data = list(reader) 14 15 return [[row[i] for row in data if len(row) > i] for i in range(1, len(data[0]))] 16 17class MainHandler(tornado.web.RequestHandler): 18 def get(self): 19 self.render("index.html") 20 21class WebSocketHandler(tornado.websocket.WebSocketHandler): 22 def open(self): 23 self.data = readcsv() 24 self.index = 0 25 self.callback = tornado.ioloop.PeriodicCallback(self.send_data, 1000) 26 self.callback.start() 27 28 def send_data(self): 29 if self.index < len(self.data): 30 column_data = self.data[self.index] 31 self.write_message(str(column_data)) 32 self.index += 1 33 34 def on_close(self): 35 if self.callback: 36 self.callback.stop() 37 38application = tornado.web.Application([ 39 (r"/", MainHandler), 40 (r"/websocket", WebSocketHandler), 41]) 42 43if __name__ == "__main__": 44 application.listen(8888) 45 tornado.ioloop.IOLoop.current().start()
html
1<!DOCTYPE html> 2<html> 3<head> 4 <title>CSV Data</title> 5</head> 6<body> 7 <h1 id="data">Loading...</h1> 8 9 <script> 10 var socket = new WebSocket("ws://localhost:8888/websocket"); 11 socket.onmessage = function(event) { 12 var columnData = JSON.parse(event.data); 13 var columnDataString = columnData.join(", "); 14 document.getElementById("data").textContent = columnDataString; 15 }; 16 </script> 17</body> 18</html>
補足情報(FW/ツールのバージョンなど)
私自身、できる言語がPythonとC#(JSは少しだけ)のみなのでできればバックエンドはこのどちらかの言語で実装したいです。