質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

Microsoft HoloLens

Microsoft HoloLensは、マイクロソフト社が開発しているヘッドマウントディスプレイ方式のコンピュータです。拡張現実体験のため透明なレンズを備えています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

2回答

892閲覧

Java server, UWP(C#)client間でのTCPIP通信

aaaddd

総合スコア22

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

Microsoft HoloLens

Microsoft HoloLensは、マイクロソフト社が開発しているヘッドマウントディスプレイ方式のコンピュータです。拡張現実体験のため透明なレンズを備えています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

0クリップ

投稿2022/06/29 07:52

前提

Javaをサーバー,C#で書かれたUWPアプリケーション(Hololens2)をクライアントとして,TCP通信で相互通信を行いたいです。

しかし、データの送受信の以前に、サーバーを立ち上げて、クライアントを立ち上げてもこの2つが接続されなくて困っています。

実現したいこと

  • [1] Hololensとほかのソフトウェアでの通信のためにその2つ間のTCPIP通信の開通

該当のソースコード

C#

1using System; 2#if UNITY_UWP 3using System.IO; 4using System.Threading.Tasks; 5using Windows.Networking; 6using Windows.Networking.Sockets; 7#endif 8 9public class TcpNetworkClientManager 10{ 11 12#if UNITY_UWP 13 private StreamWriter writer = null; 14#endif 15 16 public TcpNetworkClientManager(string IP, int port) 17 { 18#if UNITY_UWP 19 Task.Run(async () => { 20 StreamSocket socket = new StreamSocket(); 21 await socket.ConnectAsync(new HostName(IP),port.ToString()); 22 writer = new StreamWriter(socket.OutputStream.AsStreamForWrite()); 23 StreamReader reader = new StreamReader(socket.InputStream.AsStreamForRead()); 24 try 25 { 26 string data = await reader.ReadToEndAsync(); 27 } 28 catch (Exception) { } 29 writer = null; 30 }); 31#endif 32 } 33 34 public void SendMessage(string data) 35 { 36#if UNITY_UWP 37 if (writer != null) Task.Run(async () => 38 { 39 await writer.WriteAsync(data); 40 await writer.FlushAsync(); 41 }); 42#endif 43 } 44 45} 46

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TCPIP : MonoBehaviour 6{ 7 8 string IP = "127.0.0.1"; 9 int port = 3333; 10 11 // TcpNetworkClientManager client = null; 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 Debug.Log("Connected"); 17 client = new TcpNetworkClientManager(IP, port); 18 } 19 20 // Update is called once per frame 21 void Update() 22 { 23 24 } 25} 26

該当のソースコード

Java

1import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.io.PrintWriter; 5 import java.net.InetSocketAddress; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9public class server { 10 11 public static void main(String[] args) { 12 Sample1 ss = new Sample1(); 13 ss.runSample(); 14 15 } 16 17 18} 19 20class Sample1 { 21 22 void runSample() { 23 24 25 String data1 = ""; 26 String data2; 27 int num; 28 29 ServerSocket sSocket = null; 30 Socket socket = null; 31 BufferedReader reader = null; 32 BufferedReader reader2 = null; 33 34 PrintWriter writer = null; 35 36 try{ 37 //IPアドレスとポート番号を指定してサーバー側のソケットを作成 38 sSocket = new ServerSocket(3333); 39 40 41 System.out.println("クライアントからの入力待ち状態"); 42 43 //クライアントからの要求を待ち続けます 44 socket = sSocket.accept(); 45 46 System.out.println("アクセス完了"); 47 48 //クライアントからの受取用 49 reader = new BufferedReader( 50 new InputStreamReader 51 (socket.getInputStream())); 52 53 reader2 = new BufferedReader( 54 new InputStreamReader 55 (socket.getInputStream())); 56 57 //クライアントへの送信用 58 writer = new PrintWriter( 59 socket.getOutputStream(), true); 60 61 62 while(true) { 63 64 data1 = reader.readLine(); 65 System.out.println("1" +data1); 66 if(data1.equals("bye")){ 67 System.out.println("2"); 68 break; 69 } 70 71 try{ 72 73 num = Integer.parseInt(data1); 74 75 //data1 = reader.readLine(); 76 77 if(num %2 == 0){ 78 writer.println("OK"); 79 }else{ 80 writer.println("NG"); 81 } 82 83 /*System.out.println("data1 ::" + data1 + "\n" ); 84 85 data2 = reader2.readLine(); 86 87 System.out.println("data2 :: " + data2 + "\n");*/ 88 89 }catch(NumberFormatException e){ 90 //送信用の文字を送信 91 writer.println("数値を入力して下さい"); 92 } 93 94 System.out.println("クライアントで入力された文字=" + data1); 95 } 96 }catch(Exception e){ 97 System.out.println("3"); 98 e.printStackTrace(); 99 }finally{ 100 try{ 101 if (reader!=null){ 102 reader.close(); 103 } 104 if (writer!=null){ 105 writer.close(); 106 } 107 if (socket!=null){ 108 socket.close(); 109 } 110 if (sSocket!=null){ 111 sSocket.close(); 112 } 113 System.out.println("サーバー側終了です"); 114 } catch (IOException e) { 115 e.printStackTrace(); 116 } 117 } 118 } 119} 120

試したこと

https://akihiro-document.azurewebsites.net/post/hololens_sharingtcp/
https://qiita.com/SatoshiGachiFujimoto/items/91e28207ad48378d9c28
https://teratail.com/questions/130702
これらを参考に取り組んだのですが、うまく接続をできませんでした。

UWPを使用するのに慣れていないため、教えていただけると幸いです。

補足情報(FW/ツールのバージョンなど)

Unity2020.3.30.f1からビルドしたUWPアプリケーション(visual studio 2019)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/06/30 00:17 編集

tcpip 的につながる環境で実行されているのでしょうか。 また、各々何処まで動いているのか、ログやエラー等のメッセージの状態等をご質問に追加してください。 [3-4. 発生している問題・エラーメッセージを書きましょう] https://teratail.com/help/question-tips#questionTips34
dodox86

2022/06/30 00:22

> string IP = "127.0.0.1"; ということで、サーバーもクライアントも同じPC上で、つまりはローカルで動かそうとしていますか。
aaaddd

2022/06/30 05:58

>[3-4. 発生している問題・エラーメッセージを書きましょう] 特にエラーメッセージは出力されていません また、Unity内でballというGameObjectを定義してオブジェクトの非表示を実行したところ、非表示されたので追加したところの呼び出しは確認しました。 public TcpNetworkClientManager(string IP, int port) { #if UNITY_UWP //追加 ball.SetActive(false);  //ball objectの非表示 Task.Run(async () => { StreamSocket socket = new StreamSocket(); await socket.ConnectAsync(new HostName(IP),port.ToString()); writer = new StreamWriter(socket.OutputStream.AsStreamForWrite()); StreamReader reader = new StreamReader(socket.InputStream.AsStreamForRead()); try { string data = await reader.ReadToEndAsync(); } catch (Exception) { } writer = null; }); #endif }
aaaddd

2022/06/30 05:59

>ということで、サーバーもクライアントも同じPC上で、つまりはローカルで動かそうとしていますか。 はい、そのとおりです 同一PC間での通信を試みています
jimbe

2022/06/30 07:50

java の方が System.out.println で流れが分かるようになっているのと同じように、UWP の方にも細かく Debug.Log を入れてどこを通って何が起きているのかを調べてみては如何でしょうか。
aaaddd

2022/06/30 09:07

>Debug.Log を入れてどこを通って何が起きているのかを調べてみては如何でしょうか。 そうですね、一旦その方向でやろうと考えています。
guest

回答2

0

自己解決

ソケット通信できました

投稿2022/07/20 02:04

aaaddd

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

クライアント UWP 側は分かりませんのでサーバ java 側だけ。
reader と reader2 という 2 つの BufferedReader を 1 つの socket.getInputStream から作成していますが、そのようなことはできません。


ご提示の java のサーバは以下のような感じで動作・テスト出来ます。
一問一答形式で"bye"が来るまで数値の奇数/偶数を判断するサーバということになりますが、クラアントに対するサーバとして妥当な機能なのでしょうか。

Server.java

java

1package teratail_java.q_6p00dtc71nk50f; 2 3import java.io.*; 4import java.net.ServerSocket; 5import java.net.Socket; 6 7public class Server { 8 public static void main(String[] args) throws IOException { 9 try(ServerSocket ss = new ServerSocket(3333);) { 10 System.out.println("クライアントからの接続待ち"); 11 try(Socket s = ss.accept(); 12 BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream())); 13 PrintWriter writer = new PrintWriter(s.getOutputStream(), true);) { 14 System.out.println("接続"); 15 while(true) { 16 String line = reader.readLine(); 17 System.out.println("1 " + line); 18 19 if(line.equals("bye")) { 20 System.out.println("2"); 21 break; 22 } 23 24 try { 25 int num = Integer.parseInt(line); 26 writer.println(num % 2 == 0 ? "OK" : "NG"); 27 } catch(NumberFormatException e) { 28 writer.println("数値を入力して下さい"); 29 } 30 System.out.println("クライアントで入力された文字=" + line); 31 } 32 } catch(Exception e) { 33 e.printStackTrace(); 34 } 35 } 36 System.out.println("サーバー側終了です"); 37 } 38}

Client.java

java

1package teratail_java.q_6p00dtc71nk50f; 2 3import java.io.*; 4import java.net.Socket; 5import java.net.UnknownHostException; 6 7public class Client { 8 public static void main(String[] args) throws UnknownHostException, IOException { 9 try(Socket s = new Socket("127.0.0.1", 3333); 10 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 11 PrintWriter pw = new PrintWriter(s.getOutputStream(), true);) { 12 13 for(String arg : args) { 14 pw.println(arg); 15 String line = br.readLine(); 16 System.out.println(line); 17 } 18 pw.println("bye"); 19 } 20 } 21}

実行結果(Server)

plain

1>java teratail_java.q_6p00dtc71nk50f.Server 2クライアントからの接続待ち 3接続 41 123 5クライアントで入力された文字=123 61 abc 7クライアントで入力された文字=abc 81 86 9クライアントで入力された文字=86 101 bye 112 12サーバー側終了です

実行結果(Client)

plain

1>java teratail_java.q_6p00dtc71nk50f.Client 123 abc 86 2NG 3数値を入力して下さい 4OK

投稿2022/06/30 00:07

編集2022/06/30 11:14
jimbe

総合スコア12670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaddd

2022/06/30 12:49

Javaのクライアントとサーバーありがとうございます。 デバックを行った結果、 public TcpNetworkClientManager(string IP, int port) { #if UNITY_UWP Task.Run(async () => { StreamSocket socket = new StreamSocket(); await socket.ConnectAsync(new HostName(IP),port.ToString()); writer = new StreamWriter(socket.OutputStream.AsStreamForWrite()); StreamReader reader = new StreamReader(socket.InputStream.AsStreamForRead()); try { string data = await reader.ReadToEndAsync(); } catch (Exception) { } writer = null; }); #endif } TcpNetworkClientManager(string IP, int port)メソッド内には、入ることは確認したのですが #if UNITY_UWPから#endif間に入らないことが確認されました。 UWP変換をした際に、どのように書けばいいのかわかるでしょうか。 もし、わかる方いましたらご教授いただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問