pepper君とUnityで作ったPC用のアプリをローカルでソケット通信をさせて連携させたいのですがローカルでのソケット通信の方法が分からず困っています。参考でもよいので何方か教えていただけないでしょうか。
LANケーブルを繋いでの通信を想定しています。
ソースコードを載せます。ほぼすべてサイトの参考なのですが、ソケット通信について理解したつもりです。
public class test : MonoBehaviour {
Socket listener;
Socket soket;
int poot = 1234;
private Thread dispatchThread;
public bool IsLoop { get; set; } public class StateObject { // Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 1024; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder(); } List<StateObject> activeConnections = new List<StateObject>(); void Start () { HostStartup (poot); } void Update () {} //yobarerut public void test5(){ Send ("aaaaaaaaaa"); } //サーバとして起動 public void HostStartup(int poot){ listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, poot)); listener.Listen(10); Debug.Log ("ソケットを開始"); listener.BeginAccept( new AsyncCallback(AcceptCallback),listener ); //LaunchThread (); } public void AcceptCallback(IAsyncResult ar) { // Get the socket that handles the client request. Socket listener = (Socket) ar.AsyncState; Socket handler = listener.EndAccept(ar); // Create the state object. StateObject state = new StateObject(); state.workSocket = handler; handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state); //確立した接続のオブジェクトをリストに追加 //activeConnections.Add (state); //Debug.LogFormat ("there is {0} connections", activeConnections.Count); //接続待ちを再開しないと次の接続を受け入れなくなる listener.BeginAccept( new AsyncCallback(AcceptCallback),listener ); } public void ReadCallback(IAsyncResult ar) { String content = String.Empty; // Retrieve the state object and the handler socket // from the asynchronous state object. StateObject state = (StateObject) ar.AsyncState; Socket handler = state.workSocket; // Read data from the client socket. int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { // There might be more data, so store the data received so far. state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); // Check for end-of-file tag. If it is not there, read // more data. content = state.sb.ToString(); Debug.LogFormat ("content : "+content); } } //データの送信 private void Send(String data) { soket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); soket.NoDelay = true; soket.Connect(IPAddress.Parse("アドレス"),poot); // Convert the string data to byte data using ASCII encoding. byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device. soket.BeginSend(byteData, 0, byteData.Length, 0,new AsyncCallback(SendCallback), soket); } private void SendCallback(IAsyncResult ar) { try { // Retrieve the socket from the state object. Socket handler = (Socket) ar.AsyncState; // Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); //Debug.LogFormat("Sent {0} bytes to client.", bytesSent); //この2つはセットでつかるらしい handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception e) { Debug.Log(e.ToString()); } }
}
追記依頼について
申し訳ありませんでした。ご指摘感謝いたします。
実際にやりたいことはpepper君とPCを有線でつないで、pepper君から文字列をソケットでアプリに送り文字列に応じて処理をさせたいのです。
pepper君がクライアント、PCがサーバという役割です。
pepper君側のソケット通信ではPythonを使って通信させたいのですがうまく行かずに困っています。
def onInput_inputName(self, p): host = "アドレス" port = 1234 bufsize = 4096 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.send("テスト") sock.close() self.outputName(p) self.onStopped() pass
回答1件
あなたの回答
tips
プレビュー