2011-07-27 23 views
1

私はアンドロイドでチャットアプリケーションを実装しようとしています。クライアント(スマートフォン)は、コンピュータにインストールされたサーバーを介して通信します。私はクライアントとサーバーのコミュニケーションについて考えていないので、私はあなたの助けが必要です。私は多くのことを読んできました。私はHTTP(要求/応答)を使用しなければならないという結論に至りました。 HTTPでは、クライアント/サーバーの送信要求とサーバー/クライアントからの応答がそれぞれ送信されますが、これは動作しますか?ソケットは、別の方法の実装です、私はHTTPのソケットが必要ないという意味ですか?申し訳ありませんが、私はこれらすべてを求めていますが、私は本当に混乱しています。サードパーティのソフトウェアも必要ですか?私はクライアント(アンドロイドアプリケーション)とサーバー(Javaアプリケーション)をまったく別のプロジェクト、パッケージに入れました。私はまた、ログインフォームの次のコードを使用していますクライアント(Androidアプリケーション) - サーバー(Javaアプリケーション)

ます。public void tryLogin(){

//The Android logging system provides a mechanism for collecting and viewing system debug output. Logcat dumps a log of system messages, which include things such as stack traces when the emulator throws an error and messages that you have written from your application by using the Log class. 
    Log.v(TAG, "Trying to Login");//TAG used to identify the source of a log message. It usually identifies the class or activity where the log call occurs./second param The message you would like logged. 
    EditText etxt_user = (EditText) findViewById(R.id.username);//finds the username TextView 
    EditText etxt_pass = (EditText) findViewById(R.id.password);//finds the pasword TextView 
    String username1 = etxt_user.getText().toString();//gets the text that the user has typed as his/her username 
    String password1 = etxt_pass.getText().toString();//gets the text that the user haw typed as his/her password 
    DefaultHttpClient client = new DefaultHttpClient();//creates a DefaultHttpClient object 
    HttpPost httppost = new HttpPost("http://......."); 
    //add your Data 
    List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>(); 
    nvps.add(new BasicNameValuePair("username", username1)); 
    nvps.add(new BasicNameValuePair("password", password1)); 

    try { 
      UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(nvps, HTTP.UTF_8);//The message-body (if any) of an HTTP message is used to carry the entity-body associated with the request or response. The message-body differs from the entity-body only when a transfer-coding has been applied, as indicated by the Transfer-Encoding header field 
      httppost.setEntity(p_entity); 

      //Execute HTTP Post Request 
      HttpResponse response = client.execute(httppost); 
      Log.v(TAG, response.getStatusLine().toString());//HTTP/1.1 200 OK --> see DDMS //HTTP has been in use by the World-Wide Web global information initiative since 1990. This specification defines the protocol referred to as "HTTP/1.1", and is an update to RFC 2068 [33].//OK 200-->The request was fulfilled. 
      //The message-body (if any) of an HTTP message is used to carry the entity-body associated with the request or response. 
      HttpEntity responseEntity = response.getEntity(); 
      Log.v(TAG, "Set response to responseEntity" + EntityUtils.toString(responseEntity)); 

      //SAXParserFactory --> defines a factory API that enables applications to configure and obtain a SAX based parser to parse XML documents. 
      SAXParserFactory spf = SAXParserFactory.newInstance();//obtain a new instance of a SAXParserFactory 
      SAXParser sp = spf.newSAXParser();//creates a new instance of a SAXParser using the currently configured factory parameters. 
      XMLReader xr = sp.getXMLReader();//interface for reading an xml document using callbacks 
      LoginHandler myLoginHandler = new LoginHandler(); 
      xr.setContentHandler(myLoginHandler); 
      xr.parse(retrieveInputStream(responseEntity));//retrieves the response of the server 

      ParsedLoginDataSet parsedLoginDataSet = myLoginHandler.getParsedLoginData(); 
      if (parsedLoginDataSet.getExtractedString().equals("SUCCESS")) { 
       // Store the username and password in SharedPreferences after the successful login 
       SharedPreferences.Editor editor=mPreferences.edit(); 
       editor.putString("UserName", username1); 
       editor.putString("PassWord", password1); 
       editor.commit(); 
       Message myMessage=new Message(); 
       myMessage.obj="SUCCESS"; 
       handler.sendMessage(myMessage); 
      } else if(parsedLoginDataSet.getExtractedString().equals("ERROR")) { 
       Intent intent = new Intent(getApplicationContext(), LoginError.class); 
       intent.putExtra("LoginMessage", parsedLoginDataSet.getMessage()); 
       startActivity(intent); 
       removeDialog(0); 
      } 
    } catch (Exception e) 
    { 
    /** InetAddress xxxx;//this code returns the localhost 
     try {//this code returns the localhost 
     xxxx = InetAddress.getLocalHost()to.String();*///this code returns the localhost 
      Intent intent = new Intent(getApplicationContext(), LoginError.class);//calls the activity LoginError.java 
      intent.putExtra("LoginMessage", "Unable to login");//sends information with intent.putExtra. The information that will be sent is the text which we would like to appear in the TextView of the LoginError activity.(putextra(name, value????)) 
      startActivity(intent);//starts the LoginError.java activity. 
      removeDialog(0);//closes the dialog box with the message "please wait while connecting... 
      // e.printStackTrace();//It's a method of the Throwable class. All exceptions are a subclass of that class. The trace prints exactly where the program was at the moment the exception was throw. 
    /**} catch (UnknownHostException e1) {//this code returns the localhost 
     e1.printStackTrace();//this code returns the localhost 
    }*///this code returns the localhost 

     } 

}

を、ラインxr.setContentHandler(myLoginHandler)まで動作するようです。残りのコードはサーバーをビルドする必要があります。サーバーがクライアントからどのように要求を受け取り、応答を返すかまた、私は置く必要があるアドレスであるHTTPpostに?私は私のIPアドレスを入れても動作しませんが、私はデフォルトのgetewayを使うと動作するようです。少なくとも、私は通信をテストするために同じコンピュータにクライアントとサーバを持つことができますか、私は2台のコンピュータを持っている必要があります(クライアント用とサーバ用)。 多くの質問がありますが、少なくともいくつかは私に答えてください。私は本当に初心者です。

ありがとうございます!

答えて

0

RESTサービスを調べることをおすすめします。基本的な構造は、あなたのアンドロイドアプリのHTTP要求(好ましくは別のスレッド)をサーバーに送信し、サーバーがxmlまたはjsonで応答するようにすることです。

私は頻繁に使用するスレッドのHTTPポストクラスです。

import java.util.ArrayList; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import org.apache.http.util.EntityUtils; 
import android.os.Handler; 
import android.os.Message; 

public class HttpPostThread extends Thread { 
    public static final int FAILURE = 0; 
    public static final int SUCCESS = 1; 
    public static final String VKEY = "FINDURB#V0"; 

    private final Handler handler; 
    private String url; 
    ArrayList<NameValuePair> pairs; 
public HttpPostThread(String Url, ArrayList<NameValuePair> pairs, final Handler handler) 
{ 
this.url =Url; 
    this.handler = handler; 
    this.pairs = pairs; 
    if(pairs==null){ 
     this.pairs = new ArrayList<NameValuePair>(); 
    } 
} 


@Override 
public void run() 
{ 
try { 

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(url); 
HttpParams httpParameters = new BasicHttpParams(); 
int timeoutConnection = 3000; 
HttpConnectionParams.setConnectionTimeout(httpParameters, 
     timeoutConnection); 
if(pairs!=null) 
    post.setEntity(new UrlEncodedFormEntity(pairs)); 
    HttpResponse response = client.execute(post); 
    HttpEntity entity = response.getEntity(); 
    String answer = EntityUtils.toString(entity); 
    Message message = new Message(); 
      message.obj = answer; 
      message.what = HttpPostThread.SUCCESS; 
      handler.sendMessage(message); 


} catch (Exception e) { 
    e.printStackTrace(); 
    handler.sendEmptyMessage(HttpPostThread.FAILURE); 
} 

} 
} 

サーバーと通信する必要があるときはいつでも、このようなことをします。

Handler handler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      removeDialog(0); 
      switch (msg.what) 
      { 
      case HttpPostThread.SUCCESS: 
       String answer = (String)msg.obj; 
       if (answer != null) 
       { 
       //do something with the return string 
       } 
       break; 

       case HttpPostThread.FAILURE: 
       // do some error handeling 
       break; 

       default: 
       break; 
      } 
     } 
} 
ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
pairs.add(new BasicNameValuePair("key", "value")); 
HttpPostThread thread = new HttpPostThread("http://serviceURL",pairs, handler); 
thread.start(); 

以下の質問にお答えするために、サービスは任意の数のテクノロジで実装できます。以下は、上記の例からキーと値のペアを取得するphpサービスの簡単な例です。シンプルなPHPサービス

<?php 
    $value = $_POST['key']; 
    echo "The value".$value. "was received by the service!"; 
    ?> 

サーバはのhandleMessageが呼び出されます応答し、解答の内部値の

例は、この行を等しくなります

echo "The value".$value. "was received by the service!"; 
関連する問題