質問するログイン新規登録

質問編集履歴

2

コードを乗せていましたが、TCP通信のサンプル等を求める質問であったこと、自己解決の内容に直接関係のない情報であったため修正。

2025/08/31 01:38

投稿

dfaafa
dfaafa

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,218 +1,9 @@
1
1
  ### 実現したいこと
2
2
  pc上で実行したunityプロジェクトからandroidアプリ向けにビルドしoculus questで実行したunityプロジェクトにテキストを送信したい
3
3
  ### 前提
4
- oculusでVRアプリケーションを作っています.別プロジェクトからテキスト送信ができたらよいなと思い,[こちらを参考に](https://baba-s.hatenablog.com/entry/2020/09/08/090000)TCP通信を試しました.しかし,PC上でのプロジェクト間通信はうまくいくものの,oculusとpcでの通信はできせんで
4
+ oculusでVRアプリケーションを作っています.別プロジェクトからテキスト送信ができたらよいなと思い,[こちらを参考に](https://baba-s.hatenablog.com/entry/2020/09/08/090000)TCP通信を試しました.しかし,PC上でのプロジェクト間通信はうまくいくものの,oculusとpcでの通信がうくいかず苦戦ています。
5
5
  同一のネットワーク上で試しています.
6
- ### 試したこと
7
- 参考サイトのコードを試しました.
8
- ```C#
9
- using System;
10
- using System.Net.Sockets;
11
- using System.Text;
12
- using UnityEngine;
13
6
 
14
- /// <summary>
15
- /// TCP 通信を行うクライアント側のコンポーネント
16
- /// </summary>
17
- public class Client : MonoBehaviour
18
- {
19
- //================================================================================
20
- // 変数
21
- //================================================================================
22
- // この IP アドレスとポート番号はサーバ側と統一すること
23
- public string m_ipAddress = "127.0.0.1";
24
- public int m_port = 2001;
25
-
26
- private TcpClient m_tcpClient;
27
- private NetworkStream m_networkStream;
28
- private bool m_isConnection;
29
-
30
- private string m_message = "ピカチュウ"; // サーバに送信する文字列
31
-
32
- //================================================================================
33
- // 関数
34
- //================================================================================
35
- /// <summary>
36
- /// 初期化する時に呼び出されます
37
- /// </summary>
38
- private void Awake()
39
- {
40
- try
41
- {
42
- // 指定された IP アドレスとポートでサーバに接続します
43
- m_tcpClient = new TcpClient( m_ipAddress, m_port );
44
- m_networkStream = m_tcpClient.GetStream();
45
- m_isConnection = true;
46
-
47
- Debug.LogFormat( "接続成功" );
48
- }
49
- catch ( SocketException )
50
- {
51
- // サーバが起動しておらず接続に失敗した場合はここに来ます
52
- Debug.LogError( "接続失敗" );
53
- }
54
- }
55
-
56
- /// <summary>
57
- /// GUI を描画する時に呼び出されます
58
- /// </summary>
59
- public void OnGUI()
60
- {
61
- // Awake 関数で接続に失敗した場合はその旨を表示します
62
- if ( !m_isConnection )
63
- {
64
- GUILayout.Label( "接続していません" );
65
- return;
66
- }
67
-
68
- // サーバに送信する文字列
69
- m_message = GUILayout.TextField( m_message );
70
-
71
- // 送信ボタンが押されたら
72
- if ( GUILayout.Button( "送信" ) )
73
- {
74
- try
75
- {
76
- // サーバに文字列を送信します
77
- var buffer = Encoding.UTF8.GetBytes( m_message );
78
- m_networkStream.Write( buffer, 0, buffer.Length );
79
-
80
- Debug.LogFormat( "送信成功:{0}", m_message );
81
- }
82
- catch ( Exception )
83
- {
84
- // サーバが起動しておらず送信に失敗した場合はここに来ます
85
- // SocketException 型だと例外のキャッチができないようなので
86
- // Exception 型で例外をキャッチしています
87
- Debug.LogError( "送信失敗" );
88
- }
89
- }
90
- }
91
-
92
- /// <summary>
93
- /// 破棄する時に呼び出されます
94
- /// </summary>
95
- private void OnDestroy()
96
- {
97
- // 通信に使用したインスタンスを破棄します
98
- // Awake 関数でインスタンスの生成に失敗している可能性もあるので
99
- // null 条件演算子を使用しています
100
- m_tcpClient?.Dispose();
101
- m_networkStream?.Dispose();
102
-
103
- Debug.Log( "切断" );
104
- }
105
- }
106
- ```
107
-
108
-
109
- ```C#
110
- using System.Net;
111
- using System.Net.Sockets;
112
- using System.Text;
113
- using System.Threading.Tasks;
114
- using UnityEngine;
115
-
116
- /// <summary>
117
- /// TCP 通信を行うサーバ側のコンポーネント
118
- /// </summary>
119
- public class Server : MonoBehaviour
120
- {
121
- //================================================================================
122
- // 変数
123
- //================================================================================
124
- // この IP アドレスとポート番号はクライアント側と統一すること
125
- public string m_ipAddress = "127.0.0.1";
126
- public int m_port = 2001;
127
-
128
- private TcpListener m_tcpListener;
129
- private TcpClient m_tcpClient;
130
- private NetworkStream m_networkStream;
131
-
132
- private string m_message = string.Empty; // クライアントから受信した文字列
133
-
134
- //================================================================================
135
- // 関数
136
- //================================================================================
137
- /// <summary>
138
- /// 初期化する時に呼び出されます
139
- /// </summary>
140
- private void Awake()
141
- {
142
- // クライアントから文字列を受信する処理を非同期で実行します
143
- // 非同期で実行しないと接続が終了するまで受信した文字列を UI に表示できません
144
- Task.Run( () => OnProcess() );
145
- }
146
-
147
- /// <summary>
148
- /// クライアント側から通信を監視し続けます
149
- /// </summary>
150
- private void OnProcess()
151
- {
152
- var ipAddress = IPAddress.Parse( m_ipAddress );
153
- m_tcpListener = new TcpListener( ipAddress, m_port );
154
- m_tcpListener.Start();
155
-
156
- Debug.Log( "待機中" );
157
-
158
- // クライアントからの接続を待機します
159
- m_tcpClient = m_tcpListener.AcceptTcpClient();
160
-
161
- Debug.Log( "接続完了" );
162
-
163
- // クライアントからの接続が完了したので
164
- // クライアントから文字列が送信されるのを待機します
165
- m_networkStream = m_tcpClient.GetStream();
166
-
167
- while ( true )
168
- {
169
- var buffer = new byte[256];
170
- var count = m_networkStream.Read( buffer, 0, buffer.Length );
171
-
172
- // クライアントからの接続が切断された場合は
173
- if ( count == 0 )
174
- {
175
- Debug.Log( "切断" );
176
-
177
- // 通信に使用したインスタンスを破棄して
178
- OnDestroy();
179
-
180
- // 再度クライアントからの接続を待機します
181
- Task.Run( () => OnProcess() );
182
-
183
- break;
184
- }
185
-
186
- // クライアントから文字列を受信した場合は
187
- // GUI とログに出力します
188
- var message = Encoding.UTF8.GetString( buffer, 0, count );
189
- m_message += message + "\n";
190
-
191
- Debug.LogFormat( "受信成功:{0}", message );
192
- }
193
- }
194
-
195
- /// <summary>
196
- /// GUI を描画する時に呼び出されます
197
- /// </summary>
198
- private void OnGUI()
199
- {
200
- // クライアントから受信したすべての文字列を表示します
201
- GUILayout.TextArea( m_message );
202
- }
203
-
204
- /// <summary>
205
- /// 破棄する時に呼び出されます
206
- /// </summary>
207
- private void OnDestroy()
208
- {
209
- // 通信に使用したインスタンスを破棄します
210
- m_networkStream?.Dispose();
211
- m_tcpClient?.Dispose();
212
- m_tcpListener?.Stop();
213
- }
214
- }
215
- ```
216
7
  ### 発生している問題・エラーメッセージ
217
8
  接続が失敗する.→ andoroidアプリにビルドして実行しているのが原因かもしれない.
218
9
  androidでビルド&実行したものとPC上で実行したプロジェクト間でのTCP通信のサンプル等があれば教えて頂きたいです.

1

試したことの修正

2023/10/27 09:32

投稿

dfaafa
dfaafa

スコア4

title CHANGED
File without changes
body CHANGED
@@ -3,6 +3,216 @@
3
3
  ### 前提
4
4
  oculusでVRアプリケーションを作っています.別プロジェクトからテキスト送信ができたらよいなと思い,[こちらを参考に](https://baba-s.hatenablog.com/entry/2020/09/08/090000)TCP通信を試しました.しかし,PC上でのプロジェクト間通信はうまくいくものの,oculusとpcでの通信はできませんでした.
5
5
  同一のネットワーク上で試しています.
6
+ ### 試したこと
7
+ 参考サイトのコードを試しました.
8
+ ```C#
9
+ using System;
10
+ using System.Net.Sockets;
11
+ using System.Text;
12
+ using UnityEngine;
13
+
14
+ /// <summary>
15
+ /// TCP 通信を行うクライアント側のコンポーネント
16
+ /// </summary>
17
+ public class Client : MonoBehaviour
18
+ {
19
+ //================================================================================
20
+ // 変数
21
+ //================================================================================
22
+ // この IP アドレスとポート番号はサーバ側と統一すること
23
+ public string m_ipAddress = "127.0.0.1";
24
+ public int m_port = 2001;
25
+
26
+ private TcpClient m_tcpClient;
27
+ private NetworkStream m_networkStream;
28
+ private bool m_isConnection;
29
+
30
+ private string m_message = "ピカチュウ"; // サーバに送信する文字列
31
+
32
+ //================================================================================
33
+ // 関数
34
+ //================================================================================
35
+ /// <summary>
36
+ /// 初期化する時に呼び出されます
37
+ /// </summary>
38
+ private void Awake()
39
+ {
40
+ try
41
+ {
42
+ // 指定された IP アドレスとポートでサーバに接続します
43
+ m_tcpClient = new TcpClient( m_ipAddress, m_port );
44
+ m_networkStream = m_tcpClient.GetStream();
45
+ m_isConnection = true;
46
+
47
+ Debug.LogFormat( "接続成功" );
48
+ }
49
+ catch ( SocketException )
50
+ {
51
+ // サーバが起動しておらず接続に失敗した場合はここに来ます
52
+ Debug.LogError( "接続失敗" );
53
+ }
54
+ }
55
+
56
+ /// <summary>
57
+ /// GUI を描画する時に呼び出されます
58
+ /// </summary>
59
+ public void OnGUI()
60
+ {
61
+ // Awake 関数で接続に失敗した場合はその旨を表示します
62
+ if ( !m_isConnection )
63
+ {
64
+ GUILayout.Label( "接続していません" );
65
+ return;
66
+ }
67
+
68
+ // サーバに送信する文字列
69
+ m_message = GUILayout.TextField( m_message );
70
+
71
+ // 送信ボタンが押されたら
72
+ if ( GUILayout.Button( "送信" ) )
73
+ {
74
+ try
75
+ {
76
+ // サーバに文字列を送信します
77
+ var buffer = Encoding.UTF8.GetBytes( m_message );
78
+ m_networkStream.Write( buffer, 0, buffer.Length );
79
+
80
+ Debug.LogFormat( "送信成功:{0}", m_message );
81
+ }
82
+ catch ( Exception )
83
+ {
84
+ // サーバが起動しておらず送信に失敗した場合はここに来ます
85
+ // SocketException 型だと例外のキャッチができないようなので
86
+ // Exception 型で例外をキャッチしています
87
+ Debug.LogError( "送信失敗" );
88
+ }
89
+ }
90
+ }
91
+
92
+ /// <summary>
93
+ /// 破棄する時に呼び出されます
94
+ /// </summary>
95
+ private void OnDestroy()
96
+ {
97
+ // 通信に使用したインスタンスを破棄します
98
+ // Awake 関数でインスタンスの生成に失敗している可能性もあるので
99
+ // null 条件演算子を使用しています
100
+ m_tcpClient?.Dispose();
101
+ m_networkStream?.Dispose();
102
+
103
+ Debug.Log( "切断" );
104
+ }
105
+ }
106
+ ```
107
+
108
+
109
+ ```C#
110
+ using System.Net;
111
+ using System.Net.Sockets;
112
+ using System.Text;
113
+ using System.Threading.Tasks;
114
+ using UnityEngine;
115
+
116
+ /// <summary>
117
+ /// TCP 通信を行うサーバ側のコンポーネント
118
+ /// </summary>
119
+ public class Server : MonoBehaviour
120
+ {
121
+ //================================================================================
122
+ // 変数
123
+ //================================================================================
124
+ // この IP アドレスとポート番号はクライアント側と統一すること
125
+ public string m_ipAddress = "127.0.0.1";
126
+ public int m_port = 2001;
127
+
128
+ private TcpListener m_tcpListener;
129
+ private TcpClient m_tcpClient;
130
+ private NetworkStream m_networkStream;
131
+
132
+ private string m_message = string.Empty; // クライアントから受信した文字列
133
+
134
+ //================================================================================
135
+ // 関数
136
+ //================================================================================
137
+ /// <summary>
138
+ /// 初期化する時に呼び出されます
139
+ /// </summary>
140
+ private void Awake()
141
+ {
142
+ // クライアントから文字列を受信する処理を非同期で実行します
143
+ // 非同期で実行しないと接続が終了するまで受信した文字列を UI に表示できません
144
+ Task.Run( () => OnProcess() );
145
+ }
146
+
147
+ /// <summary>
148
+ /// クライアント側から通信を監視し続けます
149
+ /// </summary>
150
+ private void OnProcess()
151
+ {
152
+ var ipAddress = IPAddress.Parse( m_ipAddress );
153
+ m_tcpListener = new TcpListener( ipAddress, m_port );
154
+ m_tcpListener.Start();
155
+
156
+ Debug.Log( "待機中" );
157
+
158
+ // クライアントからの接続を待機します
159
+ m_tcpClient = m_tcpListener.AcceptTcpClient();
160
+
161
+ Debug.Log( "接続完了" );
162
+
163
+ // クライアントからの接続が完了したので
164
+ // クライアントから文字列が送信されるのを待機します
165
+ m_networkStream = m_tcpClient.GetStream();
166
+
167
+ while ( true )
168
+ {
169
+ var buffer = new byte[256];
170
+ var count = m_networkStream.Read( buffer, 0, buffer.Length );
171
+
172
+ // クライアントからの接続が切断された場合は
173
+ if ( count == 0 )
174
+ {
175
+ Debug.Log( "切断" );
176
+
177
+ // 通信に使用したインスタンスを破棄して
178
+ OnDestroy();
179
+
180
+ // 再度クライアントからの接続を待機します
181
+ Task.Run( () => OnProcess() );
182
+
183
+ break;
184
+ }
185
+
186
+ // クライアントから文字列を受信した場合は
187
+ // GUI とログに出力します
188
+ var message = Encoding.UTF8.GetString( buffer, 0, count );
189
+ m_message += message + "\n";
190
+
191
+ Debug.LogFormat( "受信成功:{0}", message );
192
+ }
193
+ }
194
+
195
+ /// <summary>
196
+ /// GUI を描画する時に呼び出されます
197
+ /// </summary>
198
+ private void OnGUI()
199
+ {
200
+ // クライアントから受信したすべての文字列を表示します
201
+ GUILayout.TextArea( m_message );
202
+ }
203
+
204
+ /// <summary>
205
+ /// 破棄する時に呼び出されます
206
+ /// </summary>
207
+ private void OnDestroy()
208
+ {
209
+ // 通信に使用したインスタンスを破棄します
210
+ m_networkStream?.Dispose();
211
+ m_tcpClient?.Dispose();
212
+ m_tcpListener?.Stop();
213
+ }
214
+ }
215
+ ```
6
216
  ### 発生している問題・エラーメッセージ
7
217
  接続が失敗する.→ andoroidアプリにビルドして実行しているのが原因かもしれない.
8
218
  androidでビルド&実行したものとPC上で実行したプロジェクト間でのTCP通信のサンプル等があれば教えて頂きたいです.