質問編集履歴

3

訂正

2017/06/06 02:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -190,10 +190,6 @@
190
190
 
191
191
 
192
192
 
193
- // TCPクライアントを閉じる
194
-
195
-
196
-
197
193
  }
198
194
 
199
195
 

2

追加

2017/06/06 02:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -91,3 +91,165 @@
91
91
  以上、どうすれば2回目以降も送受信ができるのか教えてください。
92
92
 
93
93
  よろしくお願いいたします。
94
+
95
+
96
+
97
+ サーバーのコードです。(今回必要と思う箇所だけ抜粋)
98
+
99
+ ```C#
100
+
101
+ //// 接続待ち開始ボタンのクリックイベント
102
+
103
+ private void button1_Click(object sender, EventArgs e)
104
+
105
+ {
106
+
107
+ if (SLTAlive == false)
108
+
109
+ {
110
+
111
+ // スレッド終了指示フラグを未終了に設定
112
+
113
+ SLTAlive = true;
114
+
115
+
116
+
117
+ // 接続待ち用スレッドを作成
118
+
119
+ ListeningCallbackThread =new Thread(Start);
120
+
121
+
122
+
123
+ // 接続待ち用スレッドを開始
124
+
125
+ ListeningCallbackThread.Start();
126
+
127
+
128
+
129
+ }
130
+
131
+ }
132
+
133
+
134
+
135
+
136
+
137
+ //=========================================
138
+
139
+
140
+
141
+ //接続要求受け入れ開始
142
+
143
+ public void Start()
144
+
145
+ {
146
+
147
+
148
+
149
+ // 接続要求受け入れ開始
150
+
151
+ server.Start();
152
+
153
+ form.label1.Text = "サーバー開始";
154
+
155
+
156
+
157
+ try
158
+
159
+ {
160
+
161
+ // 受信の受付を行なうための無限ループ
162
+
163
+
164
+
165
+ while (form.SLTAlive == true) // スレッド終了指示フラグでの終了指示がある場合はループ終了
166
+
167
+ {
168
+
169
+ // 受信接続キュー内で、接続待ちがあるか判断
170
+
171
+ if (server.Pending() == true)
172
+
173
+ {
174
+
175
+ // クライアントからの接続を受け付ける
176
+
177
+ TcpClient ClientSocket = server.AcceptTcpClient();
178
+
179
+
180
+
181
+ // 通信ストリームの取得
182
+
183
+ NetworkStream stream = ClientSocket.GetStream();
184
+
185
+
186
+
187
+ //Receiveメソッドの呼び出し
188
+
189
+ Receive(stream);
190
+
191
+
192
+
193
+ // TCPクライアントを閉じる
194
+
195
+
196
+
197
+ }
198
+
199
+
200
+
201
+ // 短時間だけ待機
202
+
203
+
204
+
205
+ Thread.Sleep(100);
206
+
207
+
208
+
209
+ }
210
+
211
+ }
212
+
213
+ catch (Exception ex)
214
+
215
+ {
216
+
217
+ form.label1.Text = "サーバー終了";
218
+
219
+ }
220
+
221
+
222
+
223
+ }
224
+
225
+
226
+
227
+ //=========================================
228
+
229
+
230
+
231
+ //クライアントからの受信
232
+
233
+ public void Receive(NetworkStream stream)
234
+
235
+ {
236
+
237
+ // クライアントからの電文の受信
238
+
239
+ byte[] ReceiveDate = new byte[2000];
240
+
241
+ stream.Read(ReceiveDate, 0, ReceiveDate.Length);
242
+
243
+
244
+
245
+ string str = new string(Encoding.Unicode.GetString(ReceiveDate, 0, ReceiveDate.Length).ToCharArray()); //オブジェクトの生成
246
+
247
+ str = str.TrimEnd("\0".ToCharArray());
248
+
249
+
250
+
251
+ ・・・以下省略・・・
252
+
253
+ }
254
+
255
+ ```

1

訂正

2017/06/06 02:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -25,6 +25,8 @@
25
25
  のようにTcpClientをnewしてIPアドレスの指定をしてソケットをClose()していました。
26
26
 
27
27
  サーバー側は、接続を受け付けて、クライアントから文字の受信が終わればソケットをClose()としていました。
28
+
29
+ その後、無限ループでまた接続を受け付け→処理→Close()の繰り返しです。
28
30
 
29
31
  これでは何度も同じ作業をすることになるので、クライアントのTcpClientのnewとIPアドレスの指定を一度だけして2回目以降は文字の送受信だけを行いたいと思い、下記のようにしてみました。
30
32