2017-04-04 23 views
9

ソケット接続で応答が得られず、コードに何が間違っているのか理解できませんでした。 私は、IPアドレスとポート番号を使用してソケット接続を確立することができる可能性があり、私は応答を得ることができるのtelnetを試みたとき、それはソケット接続で応答が得られません

if (nsocket.isConnected()) {} 

に入っています。

POST /てsetMap HTTP/1.1 ホスト::192.168.1.1 のContent-Type:しかし、入力はのようないくつかの他のパラメータがあるアプリケーション/ JSONを。 charset = UTF-8 のContent-Length:1234

{ "CMD": "request_get_file_list"、 "検証": "CVS"} Iは、コンテンツタイプのような接続プロパティを含む方法を知らない

、私のコードの長さ。ここで

はコードです:

public class WebService { 

public static String devicelisting() { 
    Socket nsocket; 

    String response = null; 

    try { 
     nsocket = new Socket("192.168.1.1", 6666); 
     if (nsocket.isConnected()) { 

      JSONObject json = new JSONObject(); 
      json.put("cmd", "request_get_file_list"); 
      json.put("verification", "CVS"); 
      Log.i("AsyncTask", "doInBackground: Creating socket"); 
      // nsocket = new Socket(); 
      OutputStreamWriter out = new OutputStreamWriter(nsocket.getOutputStream(), StandardCharsets.UTF_8); 
       out.write(json.toString()); 
      Log.i("Webservice", "json.toString"+json.toString()); 

      InputStream in = new BufferedInputStream(nsocket.getInputStream()); 
      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuilder stringbuilder = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       stringbuilder.append(line); 
       Log.i("line", "line.line"+line); 
      } 


      response = stringbuilder.toString(); 
      Log.i("Response", response); 
     } 
     else{ 
      Log.i("Response", "not connected"); 

     } 

    } catch (ProtocolException e) { 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return response; 
} 

問題を見つけるために私を助けてください。私はひどくこのような課題を達成するために、いくつかの(オープンソース)ライブラリが存在するが、多くの機能を実装することは困難であるしなさい私はソケット駆動イベントのために問題

+0

はあなたが参照するか、アプリ内で受けることができない応答のいずれかの種類があるかどうかを確認するために、「パケットキャプチャ」アプリを試すことができかもしれませんが、あなたのデバイス –

+1

入力がPOSTであることにより、受信実際に? HTTPを実装する場合は、開始する前にRFC 2616の知識が必要です。広すぎます。 NB 'Socket.isConnected()'は、あなたがそれをテストしている時点ではfalseになることはありません。無意味なコードを書き込まないでください。 – EJP

+1

@EJB申し訳ありませんが、私はソケット接続に新しいです。この問題を解決するにはどうすればよいですか? – Liya

答えて

0

すべての回答ありがとうございました。すべての回答が私を正しいものに導きます。私はその問題を解決することができた、ここにコードです。

   myClient = new Socket("192.168.1.1", 6666); 

      try { 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("cmd", "request_get_file_list"); 
       jsonObject.put("verification", "CVS"); 

       myClient.setKeepAlive(true); 
       try { 

        DataInputStream dis = new DataInputStream(myClient.getInputStream()); 
        DataOutputStream dos = new DataOutputStream(myClient.getOutputStream()); 

        writer = new OutputStreamWriter(dos);//, StandardCharsets.UTF_8) 
        writer.write(jsonObject.toString()); 
        System.out.println("c"); 
        writer.flush(); 
        dos.flush(); 

        System.out.println("output buffer size:" + dos.size()); 
        char c = (char) dis.read(); 
        while (c != '\0') { 
         System.out.print(c); 
         str = str.append(c); 

         if (dis.available() != 0) { 
          c = (char) dis.read(); 
         } else break; 
        } 

        dos.flush(); 
        System.out.println("String:" + str.toString()); 
        normalLoginResponse = str.toString(); 


       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
4

を解決するのに役立つ立ち往生しています。 Socket.ioの使用を検討してください。詳細については

Properties headers = new Properties(); 
headers.setProperty("Content-Type","application/json"); // your headers 
SocketIO socketIO = SocketIO(url, headers); 

は、サーバーからの応答を得ているとして、あなたが HttpURLConnectionを使用する必要があり、あなたの特定の例では SocketIO docs

編集

を見て、あなたは、ソケットを実装する必要はありません。単純にGETまたはPOSTを使用して、HttpURLConnectionを使用してデータを取得またはプッシュします。

4

アンドロイドでソケット接続のために、あなたは、単にソケット接続を実装this gist fileを使用することができます。

public SocketConnection(OnStatusChanged statusChangedListener, OnMessageReceived messageReceivedListener) { 
     mStatusListener = statusChangedListener; 
     mMessageListener = messageReceivedListener; 

     isRunning = true; 
     try { 
      InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
      mStatusListener.statusChanged(WAITING); 
      socket = new Socket(serverAddr, SERVER_PORT); 
      try { 
       printWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
       mStatusListener.statusChanged(CONNECTED); 
       bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       while (isRunning) { 
        retrieveMessage = bufferedReader.readLine(); 
        if (retrieveMessage != null && mMessageListener != null) { 
         mMessageListener.messageReceived(retrieveMessage); 
        } 
        else { 
         mStatusListener.statusChanged(DISCONNECTED); 
        } 
        retrieveMessage = null; 
       } 
      } catch (Exception e) { 
       mStatusListener.statusChanged(ERROR); 
      } finally { 
       socket.close(); 
      } 
     } catch (Exception e) { 
      mStatusListener.statusChanged(ERROR); 
     } 
    } 

UPDATE

カスタムヘッダーを設定したい場合は、単にprintWriterに書き込む必要があります。

あなたが書くとき

writer.print ("GET " + szUrl + " HTTP/1.0\r\n\r\n"); 

\ rを\ nの\ rを\ nのビット線を終了するラインフィード/キャリッジリターンを送信し、その後、別の一つはない複数のヘッダが存在することを示すために。これはHTTP形式と電子メール形式の両方の標準です。つまり、空白行はヘッダーの末尾を示します。ヘッダーを追加するには、完了するまでそのシーケンスを送信しないでください。代わりに

writer.print ("GET " + szUrl + " HTTP/1.0\r\n"); 
writer.print ("header1: value1\r\n"); 
writer.print ("header2: value2\r\n"); 
writer.print ("header3: value3\r\n"); 
// end the header section 
writer.print ("\r\n"); 
+1

範囲外で、@ Lijaは、ヘッダーとソケットを追加する方法について質問していますあなたは答えました。 –

+1

@HarisQureshi、Check the Update! –

3

次のサーバーは、まだ要求の完了を待つためのコードは、おそらくreadLine()でスタックしている行うことができます。

あなたはそれを変更することができます:私はあなたがHTTP要求を行うために、間違ったツールを使用していることを考える

// query 
out.write("POST /setMap HTTP/1.1\r\n"); 
// headers 
out.write("Host: 192.168.1.1\r\n"); 
out.write("Content-Type: application/json; charset=utf-8\r\n"); 
out.write("Content-Length: " + json.toString().getBytes(StandardCharsets.UTF_8).length + "\r\n"); 
// end of the headers 
out.write("\r\n"); 
// body 
out.write(json.toString()); 
// actually send the request 
out.flush(); 

Log.i("Webservice", "json.toString"+json.toString()); 

。ソケットは低レベルのネットワークチャネルであり、あなた自身で多くのことを行う必要があります。

代わりにHttpURLConnectionを使用することを検討する必要があります。可能であれば、より高いレベルのアプローチをとることを強くお勧めします。例えば、retrofit2のようなものを使用してください。

関連する問題