2012-01-26 48 views
1

私はソケットを使用してサーバとのストリーミング接続を確立しています。ソケットを作成することによって、ソケットを使用してサーバーに要求を送信しようとしました。私が使用する方法に関係なく、要求はサーバーによって受信されません。これらは私がリクエストを送信するために使用したメソッドです。javaでソケットを使用してサーバにリクエストを送信する

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println(query); 

または他の一つは、私が送信しようとしている要求は、このようなものである

out = new ObjectOutputStream(connection.getOutputStream()); 
out.writeObject(msg); 
out.flush(); 

です:私はこのクエリを送信すると、使用してはるかに簡単であることを知っている

String query = String.format("cmd=%s&version=%s", "handshake", "1.0"); 

Httpコネクションですが、これが完了しなければならない方法です。ですから、これで私を助けてください。 これはでHTTPConnectionが

String charset = "UTF-8"; 
String query = String.format("cmd=%s&version=%s", "handshake", "1.0"); 
String charset = "UTF-8"; 
URL url = new URL("serveraddress:8080");   
URLConnection conn = url.openConnection();   
conn.setDoOutput(true);    
conn.connect();    
OutputStream output = conn.getOutputStream();    
output.write(command.getBytes(charset));          

InputStreamReader content = new InputStreamReader(conn.getInputStream());        
String result =""; 
int c = content.read(); 
while (c != -1) { 
    result = result + ((char) c); 
     c = content.read(); 
} 
Log.v(logTag, "Received: [" + result + "]"); 

コマンドであり、これは私がソケット接続が開かログサーバに応じ

URL url = new URL("serveraddress:8080");    
String server_name = url.getHost(); 
int port = url.getPort(); 
Socket socket = new Socket(server_name, port);       

String query = "post /swarm HTTP/1.1\nHost: serveraddress\n" + 
"content-length: 27\nkeep-alive: 300\nconnection: keep-alive\n\n" + 
"cmd=handshake&version=1.0\n"; 

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
out.println(query); 

を動作しませんでしたソケットにやったし、すべての要求

を取得せずに閉じたものです
+0

サーバーがリッスンしているポートにtelnet接続できますか? – lobster1234

+0

私はhttpconnectionを使用して適切な返事を得ました、あなたはソケットを使用して異なると思いますか?私は、ポートが正常であるようにhttp接続が動作している場合は意味します。右? – Daniel

+0

はい、ポートは大丈夫です。あなたはソケットを使用するときに何か例外を見ていますか? – lobster1234

答えて

4

あなたが言及した3つのメソッド(PrintWriter、ObjectOutputStream、HTTPConnection)はすべてサーバーに送信されますが、実際に送信される内容はさまざまな方法で大きく異なります。すべての

まず、JavaのクラスObjectOutputStreamあなたは、これらのオブジェクトは、特にクラス名のインスタンスであるクラスに関する情報とともに、それに書き込みますエンコードオブジェクト、署名など、あなたこれは事実上唯一の適切ですもう一端のObjectInputStreamを使用している別のJavaアプリケーションと通信しています。特にHTTPプロトコルに準拠していないため、HTTPConnectionを使用することができるものはまったく使用できない可能性があります。

HttpURLConnectionを使用すると、実際に接続しようとしているサーバーに完全な(そして最も重要なのは、有効な)HTTP要求が構築され送信されます。次のコードを実行した場合たとえば、:80と、次のようなものを書き込みます:

URL url = new URL("http://localhost/test?cmd=handshake&version=1.0"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.connect(); 

を次に結果は、アプリケーションがローカルホストに接続することになります(これは単純化された要求であります。追加のヘッダと実際の要求の情報も。)

GET /test?cmd=handshake&version=1.0 HTTP/1.1 
Host: localhost 

最後に、あなたが実際にサーバへの純粋なテキストを送信すること、その後のPrintWriterを使用している場合。しかし、サーバーがHTTPサーバーである場合、HTTP接続に応答している可能性が高いため、要求のコマンド部分を送信するだけでは不十分です。 GET、HTTPバージョン、おそらくいくつかのヘッダー、後続の空の行、CRLF行の終わりなど、残りの部分も送信する必要があります。これはすべてPrintWriterを使って行うことができます。

Wiresharkなどのネットワークパケットアナライザをインストールして、HTTP接続を使用して接続を実行した後、手動でリクエストを構築してサーバーに送信されるものを実際に確認することをお勧めします。

また、HTTPプロトコルに関する詳細を読み上げることをお勧めします。良い出発点はWikipedia articleです。 OPでの新しい情報に基づいて

編集:

私は仮定することができ、その一部更新されたコードではいくつかの小さな矛盾がありますが、私は指摘したいと思いコピー&ペーストミス、他人であります万一に備えて。

URLConnectionに基づくソリューションでは、「/ swarm」リソースはどこにも指定されていません。追加することで、リクエストが実際に送信されたかどうか、あるいは有効かどうかは変わりませんが、ログ内でリクエストを見つけることができるかどうかに影響する可能性があります。

POSTが小文字で書かれていることを除き、クエリ文字列全体が妥当であると見なされます。最初はこれで何の違いもないと思っていましたが、Telnet経由でwww.google.comとの "get"対 "get"をしようとすると違いがあるようです。 Webサーバーがリクエストをリクエストとして認識しない場合は、リクエストを処理できないため、期待通りにログに表示されないことがあります。

サーバーの応答を実際に読み取ってSystem.outに出力して、サーバーが特定のエラーを報告しているかどうかを確認することをお勧めします。

+0

最初にあなたの完全かつ包括的な説明に感謝します。これはサーバーに送信する実際の要求です。 – Daniel

+0

文字列リクエスト= "post/swarm HTTP/1.1 \ nHost:serveraddress \ ncontent-length:27 \ n キープアライブ:300 \ nconnection:キープアライブ\ n \ n cmd =ハンドシェイクとバージョン= 1。0 \ n – Daniel

+0

HTTPリクエストで言及すべきすべてのことを言及しましたが、ネットワークパケットアナライザを使用することをお勧めします。私もそれを試してみるつもりです。 – Daniel

関連する問題