私は、SNPについて何も知りません。あなたのコードは受信側で少し混乱しています。私はHTTP GET要求のためのサーバレスポンスを送信して読むために、この例を使っています。最初にリクエストを見てから、レスポンスを調べてみましょう。我々はすでに指定されている、それは、正確に202バイトである知っているので、私は意図的に、サーバの応答の本体をommitedいる
HTTP/1.1 200 OK
Date: Sun, 07 Jul 2013 17:13:10 GMT
Server: Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.16
Last-Modified: Sat, 30 Mar 2013 11:28:59 GMT
ETag: \"ca-4d922b19fd4c0\"
Accept-Ranges: bytes
Content-Length: 202
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
string - "HTTP/1.1 200 OK\r\nDate: Sun, 07 Jul 2013 17:13:10 GMT\r\nServer: Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.16\r\nLast-Modified: Sat, 30 Mar 2013 11:28:59 GMT\r\nETag: \"ca-4d922b19fd4c0\"\r\nAccept-Ranges: bytes\r\nContent-Length: 202\r\nKeep-Alive: timeout=5, max=100\r\nConnection: Keep-Alive\r\nContent-Type: text/html\r\n\r\n"
:
GET/HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Accept: text/html
User-Agent: CSharpTests
string - "GET/HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: keep-alive\r\nAccept: text/html\r\nUser-Agent: CSharpTests\r\n\r\n"
ServerのHTTPレスポンスヘッダ:
HTTP GETリクエスト
レスポンスヘッダーのContent-Lengthで指定します。
HTTP仕様を調べると、HTTPヘッダーが空の改行( "\ r \ n \ r \ n")で終わることがわかります。だから我々はそれを検索する必要があります。
実際のコードを見てみましょう。 System.Net.Sockets.Socket型の可変ソケットを想定します。
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("127.0.0.1", 80);
string GETrequest = "GET/HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: keep-alive\r\nAccept: text/html\r\nUser-Agent: CSharpTests\r\n\r\n";
socket.Send(Encoding.ASCII.GetBytes(GETrequest));
私たちはサーバーに要求を送りました。応答を受け取り、正しく解析しましょう。
bool flag = true; // just so we know we are still reading
string headerString = ""; // to store header information
int contentLength = 0; // the body length
byte[] bodyBuff = new byte[0]; // to later hold the body content
while (flag)
{
// read the header byte by byte, until \r\n\r\n
byte[] buffer = new byte[1];
socket.Receive(buffer, 0, 1, 0);
headerString += Encoding.ASCII.GetString(buffer);
if (headerString.Contains("\r\n\r\n"))
{
// header is received, parsing content length
// I use regular expressions, but any other method you can think of is ok
Regex reg = new Regex("\\\r\nContent-Length: (.*?)\\\r\n");
Match m = reg.Match(headerString);
contentLength = int.Parse(m.Groups[1].ToString());
flag = false;
// read the body
bodyBuff = new byte[contentLength];
socket.Receive(bodyBuff, 0, contentLength, 0);
}
}
Console.WriteLine("Server Response :");
string body = Encoding.ASCII.GetString(bodyBuff);
Console.WriteLine(body);
socket.Close();
これはおそらくC#でこれを行うには最悪の方法であり、.NETでHTTPリクエストとレスポンスを処理するためのクラスのトンがありますが、あなたがそれを必要に応じて、まだ、それが動作します。
「System.Net.Http.HttpClient」ではなく、ソケットを使用する必要がある理由はありますか?そのために –
またはWebclient ... – steveg89
いいえ具体的な理由はありません。実際には、私はHttpCLientまたはWebclientを認識していませんでした。しかし、とにかく、私は上記のコードで狼狽を理解したいと思う。 – RanRag