質問編集履歴

3

追記

2021/09/15 17:40

投稿

abroad128
abroad128

スコア60

test CHANGED
File without changes
test CHANGED
@@ -171,3 +171,111 @@
171
171
  }
172
172
 
173
173
  ```
174
+
175
+ 送信部もStreamWriterを使わずにこうすると成功します.
176
+
177
+ ```C#
178
+
179
+ using System;
180
+
181
+ using System.Collections.Generic;
182
+
183
+ using System.IO;
184
+
185
+ using System.Linq;
186
+
187
+ using System.Net.Sockets;
188
+
189
+ using System.Text;
190
+
191
+ using System.Threading.Tasks;
192
+
193
+
194
+
195
+ namespace ConsoleApp6
196
+
197
+ {
198
+
199
+ class Program
200
+
201
+ {
202
+
203
+ static void Main(string[] args)
204
+
205
+ {
206
+
207
+ var client = new TcpClient();
208
+
209
+ client.Connect("www.google.co.jp", 80);
210
+
211
+
212
+
213
+ var stream = client.GetStream();
214
+
215
+
216
+
217
+ var sendBytes = Encoding.UTF8.GetBytes("GET http://www.google.co.jp/ HTTP/1.1\r\nHost:www.google.co.jp\r\n\r\n" + '\n');
218
+
219
+ stream.Write(sendBytes, 0, sendBytes.Length);
220
+
221
+
222
+
223
+ var ms = new MemoryStream();
224
+
225
+ var resBytes = new byte[256];
226
+
227
+ var resSize = 0;
228
+
229
+ do
230
+
231
+ {
232
+
233
+ //データの一部を受信する
234
+
235
+ resSize = stream.Read(resBytes, 0, resBytes.Length);
236
+
237
+ //Readが0を返した時はサーバーが切断したと判断
238
+
239
+ if (resSize == 0)
240
+
241
+ {
242
+
243
+ Console.WriteLine("サーバーが切断しました。");
244
+
245
+ break;
246
+
247
+ }
248
+
249
+ //受信したデータを蓄積する
250
+
251
+ ms.Write(resBytes, 0, resSize);
252
+
253
+ //まだ読み取れるデータがあるか、データの最後が\nでない時は、
254
+
255
+ // 受信を続ける
256
+
257
+ } while (stream.DataAvailable || resBytes[resSize - 1] != '\n');
258
+
259
+ //受信したデータを文字列に変換
260
+
261
+ var resMsg = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
262
+
263
+ ms.Close();
264
+
265
+ //末尾の\nを削除
266
+
267
+ resMsg = resMsg.TrimEnd('\n');
268
+
269
+ Console.WriteLine(resMsg);
270
+
271
+
272
+
273
+ Console.Read();
274
+
275
+ }
276
+
277
+ }
278
+
279
+ }
280
+
281
+ ```

2

追記

2021/09/15 17:40

投稿

abroad128
abroad128

スコア60

test CHANGED
File without changes
test CHANGED
@@ -63,3 +63,111 @@
63
63
  }
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ このようにした場合はReadの部分で止まってしまいます.
70
+
71
+ ```C#
72
+
73
+ using System;
74
+
75
+ using System.Collections.Generic;
76
+
77
+ using System.IO;
78
+
79
+ using System.Linq;
80
+
81
+ using System.Net.Sockets;
82
+
83
+ using System.Text;
84
+
85
+ using System.Threading.Tasks;
86
+
87
+
88
+
89
+ namespace ConsoleApp6
90
+
91
+ {
92
+
93
+ class Program
94
+
95
+ {
96
+
97
+ static void Main(string[] args)
98
+
99
+ {
100
+
101
+ var client = new TcpClient();
102
+
103
+ client.Connect("www.google.co.jp", 80);
104
+
105
+
106
+
107
+ var stream = client.GetStream();
108
+
109
+ var sw = new StreamWriter(stream);
110
+
111
+ sw.Write("GET http://www.google.co.jp/ HTTP/1.1\r\nHost:www.google.co.jp\r\n\r\n");
112
+
113
+
114
+
115
+ var ms = new MemoryStream();
116
+
117
+ var resBytes = new byte[256];
118
+
119
+ var resSize = 0;
120
+
121
+ do
122
+
123
+ {
124
+
125
+ //データの一部を受信する
126
+
127
+ resSize = stream.Read(resBytes, 0, resBytes.Length);
128
+
129
+ //Readが0を返した時はサーバーが切断したと判断
130
+
131
+ if (resSize == 0)
132
+
133
+ {
134
+
135
+ Console.WriteLine("サーバーが切断しました。");
136
+
137
+ break;
138
+
139
+ }
140
+
141
+ //受信したデータを蓄積する
142
+
143
+ ms.Write(resBytes, 0, resSize);
144
+
145
+ //まだ読み取れるデータがあるか、データの最後が\nでない時は、
146
+
147
+ // 受信を続ける
148
+
149
+ } while (stream.DataAvailable || resBytes[resSize - 1] != '\n');
150
+
151
+ //受信したデータを文字列に変換
152
+
153
+ string resMsg = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
154
+
155
+ ms.Close();
156
+
157
+ //末尾の\nを削除
158
+
159
+ resMsg = resMsg.TrimEnd('\n');
160
+
161
+ Console.WriteLine(resMsg);
162
+
163
+
164
+
165
+ Console.Read();
166
+
167
+ }
168
+
169
+ }
170
+
171
+ }
172
+
173
+ ```

1

コード修正

2021/09/15 17:09

投稿

abroad128
abroad128

スコア60

test CHANGED
File without changes
test CHANGED
@@ -32,33 +32,25 @@
32
32
 
33
33
  {
34
34
 
35
- using (var client = new TcpClient())
35
+ var client = new TcpClient();
36
36
 
37
- {
38
-
39
- client.Connect("www.google.co.jp", 80);
37
+ client.Connect("www.google.co.jp", 80);
40
38
 
41
39
 
42
40
 
43
- using (var stream = client.GetStream())
41
+ var stream = client.GetStream();
44
42
 
45
- {
43
+ var sw = new StreamWriter(stream);
46
44
 
47
- var sw = new StreamWriter(stream);
48
-
49
- sw.Write("GET http://www.google.co.jp/ HTTP/1.1\r\nHost:www.google.co.jp\r\n\r\n");
45
+ sw.Write("GET http://www.google.co.jp/ HTTP/1.1\r\nHost:www.google.co.jp\r\n\r\n");
50
46
 
51
47
 
52
48
 
53
- var sr = new StreamReader(stream);
49
+ var sr = new StreamReader(stream);
54
50
 
55
- var res = sr.ReadToEnd();
51
+ var res = sr.ReadToEnd();
56
52
 
57
- Console.WriteLine(res);
53
+ Console.WriteLine(res);
58
-
59
- }
60
-
61
- }
62
54
 
63
55
 
64
56