前提・実現したいこと
一つのパソコンを使ってpythonでリアルタイムに計算した結果をC#(unity)で受け取りたい。
そこでパイプ処理というものに行きつき、さっそくデモ用にpythonで送信し、それをほかのpythonのプログラムで受信することはできました。参考URL
このpythonの受信プログラムをunityでも使える形にしようとしています。
(pythonで送信して、C#で受信)送信側のpythonのプログラムは変えなくてよいはず?
しかし受信用のプログラムをC#にどう書き直せばよいのかわからず、とりあえず、ほかのサイトを見て実装だけしようと思いました。
このサイトをみて、SocketServer、Serverというスクリプトを作り、ポートを50007としても、デバックログには何も出力されずに挫折しました。
上の方法をあきらめ、
他のサイトのC#クライアントのページをみてunityで使えるように書きましたが下のようすぐ接続が切れてしまい、データが受け取れません。
TCPC#クライアント
発生している問題・エラーメッセージ
pythonから送られてくるデータをunityで逐次とりたいが、切断される。
該当のソースコード
これがpythonの受信プログラムです。
2秒おきに、データを受け取っているつもりです。
これならpythonで送信される値をとれることがわかりました。
これをC#出かければ最高なのですが、、、
python
1import socket 2import time 3import datetime 4 5HOST = '127.0.0.1' # The remote host 6PORT = 50007 # The same port as used by the server 7for i in range(10): 8 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 s.connect((HOST, PORT)) 10 11 s.send("Hallo".encode('utf-8')) 12 data = s.recv(1024) 13 s.close() 14 print ('Received', (data).decode('utf-8')) 15 time.sleep(2.0) //2秒おきにデータをもらうために 16 17
これを自分なりにunityで動くように考えたものが↓です。
(2秒おきとかは考えずに来たデータを蓄積する)
C#
1using UnityEngine; 2using System; 3using System.IO; 4using System.Net; 5using System.Net.Sockets; 6using System.Collections.Generic; 7 8public class Cserver : MonoBehaviour { 9 10 // Use this for initialization 11 void Start () { 12 13 var HOST = "127.0.0.1"; 14 var PORT = 50007; 15 var data = 0; 16 System.Net.Sockets.TcpClient tcp = 17 new System.Net.Sockets.TcpClient(HOST, PORT); 18 Debug.Log("サーバと接続した"); 19 20 //NetworkStreamを取得する 21 System.Net.Sockets.NetworkStream ns = tcp.GetStream(); 22 23 24 //読み取り、書き込みのタイムアウトを10秒にする 25 //デフォルトはInfiniteで、タイムアウトしない 26 //(.NET Framework 2.0以上が必要) 27 ns.ReadTimeout = 100000; 28 ns.WriteTimeout = 100000; 29 30 var sendMsg = "hallo"; 31 //サーバーにデータを送信する 32 //文字列をByte型配列に変換 33 System.Text.Encoding enc = System.Text.Encoding.UTF8; 34 byte[] sendBytes = enc.GetBytes(sendMsg + '\n'); 35 //データを送信する 36 ns.Write(sendBytes, 0, sendBytes.Length); 37 Debug.Log(sendMsg); 38 39 40 //サーバーから送られたデータを受信する 41 System.IO.MemoryStream ms = new System.IO.MemoryStream(); 42 byte[] resBytes = new byte[256]; 43 int resSize = 0; 44 do 45 { 46 //データの一部を受信する 47 resSize = ns.Read(resBytes, 0, resBytes.Length); 48 //Readが0を返した時はサーバーが切断したと判断 49 if (resSize == 1) 50 { 51 Debug.Log("サーバーが切断しました。"); 52 break; 53 } 54 //受信したデータを蓄積する 55 ms.Write(resBytes, 0, resSize); 56 //まだ読み取れるデータがあるか、データの最後が\nでない時は、 57 // 受信を続ける 58 } while (ns.DataAvailable || resBytes[resSize - 1] != '\n'); 59 //受信したデータを文字列に変換 60 string resMsg = enc.GetString(ms.GetBuffer(), 0, (int)ms.Length); 61 ms.Close(); 62 //末尾の\nを削除 63 resMsg = resMsg.TrimEnd('\n'); 64 Debug.Log(resMsg); 65 66 //閉じる 67 ns.Close(); 68 tcp.Close(); 69 Debug.Log("切断しました。"); 70 71 Console.ReadLine(); 72 Debug.Log(data); 73 74 } 75 76 // Update is called once per frame 77 void Update () { 78 79 80 } 81} 82 83
このC#のプログラムをunityで動かすと下のようになります。
これがpythonの送信プログラムです。このプログラムは変える必要はないと思います。
pythonの送信側は将来的に0か1か2かを2秒おきぐらいに送信するだけなので今は1を連続して送信しています。
python
1import socket 2import threading 3import time 4import datetime 5 6HOST = '127.0.0.1' 7PORT = 50007 8INTERVAL = 1 # 測定間隔 9status = { "result" : "" } # 結果保存用 10 11# 測定実行用スレッドのクラス 12class MyThread(threading.Thread): 13 14 def __init__(self): 15 super(MyThread, self).__init__() 16 self.setDaemon(True) 17 18 def run(self): 19 for i in range(50): 20 result = str(1) 21 print (result) 22 status["result"] = result 23 time.sleep(INTERVAL) 24 25 26 # サーバを作成して動かす関数 27def socket_work(): 28 29 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 30 s.bind((HOST, PORT)) 31 s.listen(1) 32 33 while True: 34 conn, addr = s.accept() 35 print ('Connected by', addr) 36 data = conn.recv(1024) 37 print (data.decode('utf-8')) 38 conn.send(status["result"].encode('utf-8')) 39 conn.close() 40 41if __name__ == '__main__': 42 43 # スレッドの作成と開始 44 mythread = MyThread() 45 mythread.start() 46 47 # サーバを作成して動かす 48 socket_work()
このC#のプログラムがなぜ意図した動きをしないのか、
pythonの受信用のプログラムをC#に書き換えたいですが、うまくいきません。
C#では2秒おきぐらいにpythonから来るデータを2秒おきに確認してそれによってアニメーションさせようと考えています。いま、そのデータの受信ができずに手が止まってしまっています。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/11 03:58
2018/11/11 06:22
2018/11/11 07:20