2009-07-23 7 views
4

J'essaye d'écrire un client HTTP "brut" en C#. Vous pouvez demander pourquoi?Ecriture d'un client HTTP "brut" en C#

Mon but est d'implémenter un client HTTP dans J2ME (qui ne peut faire que GET et POST limité), mais d'abord j'ai besoin de mieux comprendre le protocole HTTP (d'où la tentative C#).

Mes premières tentatives échouent:

var requestBytes = Encoding.UTF8.GetBytes(@"GET/HTTP/1.1 
User-Agent: CSharp 
Host: www.google.com 

"); 
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.Connect("www.google.com", 80); 
socket.Send(requestBytes); 
var responseBytes = new byte[socket.ReceiveBufferSize]; 
socket.Receive(responseBytes); 
Console.Out.Write(Encoding.UTF8.GetString(responseBytes)); 

La prise ouvre, mais bloque alors à l'appel de réception. Après quelques secondes, l'hôte distant ferme la connexion.

Des idées? Il en va de même lorsque j'essaie de me connecter en utilisant le mode RAW dans puTTY.

+0

Votre code fonctionne bien ... J'ai simplement copié et collé ce que vous avez dans une nouvelle application de console, et cela a fonctionné à 100%. Vous pourriez avoir d'autres problèmes (réseau, ou autre). –

+0

merci Timothy. Je suppose que mon problème est que je suis derrière un serveur proxy. va tester à nouveau moi-même ... – Ries

+0

couper et coller est bien pour moi. – divinci

Répondre

3

Il est peut-être préférable de tester cette option pour installer localement IIS ou Apache, puis utiliser l'adresse 127.0.0.1; cela vous donne plus de latitude pour tester différentes choses! Étant un peu prude, je n'aimerais pas que quelqu'un utilise mon site Web pour tester leur implémentation du protocole HTTP.

+0

Et à ce point ... Google pourrait dire ... "user-agent: CSharp? ... je ne pense pas!" (Je ne pense pas que c'est ce qui se passe, mais le point est, tester dans un environnement contrôlé afin que vous * sachiez * que le problème est votre code.) –

+0

sûr, en fait, je testais contre mon propre serveur , mais ne voulait pas publier l'adresse ici. désolé google pour utiliser votre adresse à la place: | – Ries

-5

Je pense que vous devez utiliser la classe TcpListener.

// Begin listening for incoming connection requests 
TcpListener myListener = new TcpListener("localhost", 8080); // change to yours 
myListener.Start(); 

Puis

Socket mySocket = myListener.AcceptSocket(); 
if (mySocket.Connected) 
{ 
    // do some work 
    mySocket.Send(<data>, <length>, 0); 
} 

espère que cela aidera.

+1

Il établit une connexion sortante, n'écoute pas les connexions entrantes. –

1

Si vous allez jouer au niveau «brut», alors vous êtes responsable de la compréhension des protocoles là-bas. Voir Hypertext Transfer Protocol -- HTTP/1.1 .

Sinon, vous devriez simplement vous en tenir aux classes WebRequest et WebClient.

+0

D'accord - il y a beaucoup plus dans le protocole que vous pouvez le faire simplement en essayant de faire des connexions par tâtonnement. C'est une entreprise sérieuse d'écrire un client HTTP. –

+0

Son point est de le comprendre d'un point de vue du code afin de le coder dans une autre langue ... l'utilisation de classes spécifiques .NET ne serait pas utile dans ce cas. –

+0

Ensuite, il ferait bien de lire et de comprendre ce RFC et ceux sur lesquels il est basé. Peut-il même dire sur quel protocole HTTP est basé? (Ne pas aider l'étudiant, maintenant) –