【Android笔记】Android与服务器通信 http和socket两种形式

1、 http形式

   服务器端建立:

EncodingFilter.java代码如下:

 1 package com.example;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 
 7 import javax.servlet.FilterChain;
 8 
 9 import javax.servlet.FilterConfig;
10 
11 import javax.servlet.ServletException;
12 
13 import javax.servlet.ServletRequest;
14 
15 import javax.servlet.ServletResponse;
16 
17 import javax.servlet.http.HttpServletRequest;
18 
19 /**
20 
21  * Servlet Filter implementation class EncodingFilter
22 
23  */
24 
25 public class EncodingFilter implements Filter {
26     /**
27 
28      * Default constructor.
29 
30      */
31 
32     public EncodingFilter() {
33 
34      
35     }
36 
37  /**
38 
39   * @see Filter#destroy()
40 
41   */
42 
43  public void destroy() {
44 
45  }
46 
47  
48  /**
49 
50   * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
51 
52   */
53 
54  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
55 
56   HttpServletRequest req = (HttpServletRequest) request;
57 
58  
59 
60   if("GET".equals(req.getMethod())){
61 
62    EncodingHttpServletRequest  wrapper = new EncodingHttpServletRequest(req);
63 
64    chain.doFilter(wrapper, response);
65 
66   } else {//post
67 
68    req.setCharacterEncoding("UTF-8");
69 
70    chain.doFilter(request, response);
71 
72   }
73  
74  }
75 
76  /**
77 
78   * @see Filter#init(FilterConfig)
79 
80   */
81 
82  public void init(FilterConfig fConfig) throws ServletException {
83 
84  
85  }
86 
87 }

EncodingHttpServletRequest.java代码如下:

package com.example;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

 
public class EncodingHttpServletRequest extends HttpServletRequestWrapper {

 private HttpServletRequest request;

 public EncodingHttpServletRequest(HttpServletRequest request) {

  super(request);

  this.request = request;

 }

 @Override

 public String getParameter(String name) {

  String value = request.getParameter(name);

  if(value!=null){

   try {

    value = new String(value.getBytes("ISO8859-1"),"UTF-8");

   } catch (UnsupportedEncodingException e) {

   

    e.printStackTrace();

   }

  }

  return value;

 }

}

Servlet.java代码如下

 1 package com.example;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 
 7 import javax.servlet.http.HttpServlet;
 8 
 9 import javax.servlet.http.HttpServletRequest;
10 
11 import javax.servlet.http.HttpServletResponse;
12 
13 import com.example.EncodingHttpServletRequest;
14 
15 /**
16 
17  * Servlet implementation class ManageServlet
18 
19  */
20 
21 public class servlet extends HttpServlet {
22 
23  private static final long serialVersionUID = 1L;
24 
25       /**
26 
27      * @see HttpServlet#HttpServlet()
28 
29      */
30 
31     public servlet() {
32 
33         super();
34 
35     }
36  
37  /**
38 
39   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
40 
41   */
42 
43  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
44 
45   String title = request.getParameter("title");
46 
47   EncodingHttpServletRequest requsete = new EncodingHttpServletRequest(request);
48 
49   String titlee = requsete.getParameter("title");
50 
51   //把客户端传递过来的参数进行重新编码使之能支持中文
52 
53   title = new String(title.getBytes("GB2312"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作
54 
55   String timelength = request.getParameter("timelength");
56 
57   System.out.println("视频名称:"+titlee);
58 
59   System.out.println("播放时长:"+timelength);
60 
61  }
62 
63  /**
64 
65   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
66 
67   */
68 
69  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
70 
71   String title = request.getParameter("title");
72 
73   //把客户端传递过来的参数进行重新编码使之能支持中文
74 
75   title = new String(title.getBytes("GB2312"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作
76 
77   String timelength = request.getParameter("timelength");
78 
79   System.out.println("视频名称:"+title);
80 
81   System.out.println("播放时长:"+timelength);
82 
83  }
84 }

既然有servlet就不得不在web.xml中配置一下了

 1 <servlet>
 2 
 3    <servlet-name>servlet</servlet-name>
 4 
 5    <servlet-class>com.example.servlet</servlet-class>
 6 
 7  </servlet>
 8 
 9  <servlet-mapping>
10 
11    <servlet-name>servlet</servlet-name>
12 
13    <url-pattern>/servlet</url-pattern>
14 
15   </servlet-mapping>

进行通信是必须先把服务器打开,所以先把servlet用tomcat打开,

http://localhost:8080/http_service/servlet

客户端建立:

Http_androidActivity.java代码

 1 package com.example.newsmanage;
 2 import android.app.Activity;
 3 import android.os.Bundle;
 4 
 5 public class Http_androidActivity extends Activity {
 6     /** Called when the activity is first created. */
 7     @Override
 8     public void onCreate(Bundle savedInstanceState) {
 9 
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.main);
12     }
13 }

NewsManageActivity.java代码

 1 package com.example.newsmanage;
 2 
 3 import com.example.service.NewsService;
 4 import android.app.Activity;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.Button;
 8 import android.widget.EditText;
 9 import android.widget.Toast;
10 
11 public class NewsManageActivity extends Activity {
12     /** Called when the activity is first created. */
13  EditText titleText;
14  EditText lengthText;
15  Button button;
16 
17     @Override
18     public void onCreate(Bundle savedInstanceState) {
19 
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.main);     
22 
23         titleText = (EditText) this.findViewById(R.id.title);
24         lengthText = (EditText) this.findViewById(R.id.timelength);
25         button = (Button) this.findViewById(R.id.button);
26     }
27 
28     public void save(View v) throws Exception{
29 
30      String title = titleText.getText().toString();
31      String timelength = lengthText.getText().toString();
32 
33      boolean result = NewsService.save(title,timelength);
34 
35      if(result){
36 
37       Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();
38 
39      } else {
40       Toast.makeText(getApplicationContext(), R.string.fail, Toast.LENGTH_LONG).show();
41      }
42     }
43 }

NewsService.java代码

package com.example.service;

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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;

public class NewsService {
 /**

  * 保存数据,传递参数给web服务器端

  * @param title 标题

  * @param timelength 时长

  * @return

  */

 public static boolean save(String title, String timelength) throws Exception {

  //119.119.228.5为本机IP地址,不能用localhost代替

  String path = "http://192.168.1.5:8080/http_service/servlet";

  Map<String,String> params = new HashMap<String,String>();

  params.put("title", title);

  params.put("timelength", timelength);

  //get请求方式

  return sendGETRequest(path,params,"UTF-8");

  //post请求方式

  //return sendPOSTRequest(path,params,"UTF-8");

  //httpClient请求方式,如果单纯传递参数的话建议使用GET或者POST请求方式

  //return sendHttpClientPOSTRequest(path,params,"UTF-8");//httpclient已经集成在android中

 }

 /**

  * 通过HttpClient发送post请求

  * @param path

  * @param params

  * @param encoding

  * @return

  * @throws Exception

  */

 private static boolean sendHttpClientPOSTRequest(String path,

   Map<String, String> params, String encoding) throws Exception {

  List<NameValuePair> pairs = new ArrayList<NameValuePair>();//存放请求参数

  for(Map.Entry<String, String> entry:params.entrySet()){

   pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

  }

  //防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

  UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);

  HttpPost httpPost = new HttpPost(path);

  httpPost.setEntity(entity);

  DefaultHttpClient client = new DefaultHttpClient();

  HttpResponse response = client.execute(httpPost);

  if(response.getStatusLine().getStatusCode() == 200){

   return true;

  }

  return false;

 }

 /**

  * 放松post请求

  * @param path 请求路径

  * @param params 请求参数

  * @param encoding 编码

  * @return 请求是否成功

  */

 private static boolean sendPOSTRequest(String path,

   Map<String, String> params, String encoding) throws Exception{

  StringBuilder data = new StringBuilder(path);

  for(Map.Entry<String, String> entry:params.entrySet()){

  data.append(entry.getKey()).append("=");

   //防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

  data.append(URLEncoder.encode(entry.getValue(),encoding));

   data.append("&");

  }

  data.deleteCharAt(data.length() - 1);

  byte[] entity = data.toString().getBytes();//得到实体数据

  HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();

  conn.setConnectTimeout(5000);

  conn.setRequestMethod("POST");

  conn.setDoOutput(true);//设置为允许对外输出数据


 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

 conn.setRequestProperty("Content-Length", String.valueOf(entity.length));


  OutputStream outStream = conn.getOutputStream();

  outStream.write(entity);//写到缓存


  if(conn.getResponseCode()==200){//只有取得服务器返回的http协议的任何一个属性时才能把请求发送出去

   return true;

  }

  return false;

 }

 /**

  * 发送GET请求

  * @param path 请求路径

  * @param params 请求参数

  * @return 请求是否成功

  * @throws Exception

  */

 private static boolean sendGETRequest(String path,

   Map<String, String> params,String encoding) throws Exception {

  StringBuilder url = new StringBuilder(path);

  url.append("?");

  for(Map.Entry<String, String> entry:params.entrySet()){

  url.append(entry.getKey()).append("=");

   //get方式请求参数时对参数进行utf-8编码,URLEncoder

   //防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8

  url.append(URLEncoder.encode(entry.getValue(), encoding));

   url.append("&");

  }

  url.deleteCharAt(url.length()-1);

  HttpURLConnection conn = (HttpURLConnection) new URL(url.toString()).openConnection();

  conn.setConnectTimeout(5000);

  conn.setRequestMethod("GET");

  if(conn.getResponseCode() == 200){

   return true;

  }

  return false;

 }

}

Main.xml代码如下

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 4 
 5     android:layout_width="fill_parent"
 6 
 7     android:layout_height="fill_parent"
 8 
 9     android:orientation="vertical" >
10 
11  
12 
13    <TextView
14 
15         android:layout_width="fill_parent"
16 
17         android:layout_height="wrap_content"
18 
19         android:text="@string/title" />
20 
21  
22 
23    <EditText
24 
25         android:id="@+id/title"
26 
27         android:layout_width="fill_parent"
28 
29         android:layout_height="wrap_content" >
30 
31  
32 
33         <requestFocus />
34 
35    </EditText>
36 
37  
38 
39    <TextView
40 
41         android:id="@+id/textView1"
42 
43         android:layout_width="fill_parent"
44 
45         android:layout_height="wrap_content"
46 
47         android:text="@string/timelength" />
48 
49  
50 
51    <EditText
52 
53         android:id="@+id/timelength"
54 
55         android:layout_width="fill_parent"
56 
57         android:layout_height="wrap_content" android:numeric="integer"/>
58 
59  
60 
61    <Button
62 
63         android:id="@+id/button"
64 
65         android:layout_width="wrap_content"
66 
67         android:layout_height="wrap_content"
68 
69         android:text="@string/button" android:onClick="save"/>
70 
71  
72 
73 </LinearLayout>

AndroidManifest.xml代码如下

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 4 
 5     package="com.example.newsmanage"
 6 
 7     android:versionCode="1"
 8 
 9     android:versionName="1.0" >
10 
11  
12 
13    <uses-sdk android:minSdkVersion="7" />
14 
15  
16 
17    <application
18 
19         android:icon="@drawable/ic_launcher"
20 
21         android:label="@string/app_name" >
22 
23         <activity
24 
25            android:name=".NewsManageActivity"
26 
27            android:label="@string/app_name" >
28 
29             <intent-filter>
30 
31                 <action android:name="android.intent.action.MAIN" />
32 
33  
34 
35                 <category android:name="android.intent.category.LAUNCHER" />
36 
37             </intent-filter>
38 
39         </activity>
40 
41    </application>
42 
43  <uses-permission android:name="android.permission.INTERNET"/>
44 
45    
46 
47 </manifest>

开发好后就开始测试吧,先运行android客户端,这里服务器端不接收中文的,你可以设置一下编码格式的。

点击发送,在服务器端就会接收到发送过来的信息

测试成功。

2、 socket形式

服务器端建立比较简单,只要建一个java文件就可以了,一直运行着就可以了。

socket_service.java代码

  1 package example;
  2 
  3  
  4 
  5  
  6 
  7 import java.io.BufferedReader; 
  8 
  9 import java.io.BufferedWriter; 
 10 
 11 import java.io.InputStreamReader; 
 12 
 13 import java.io.OutputStreamWriter; 
 14 
 15 import java.io.PrintWriter;  
 16 
 17 import java.net.ServerSocket; 
 18 
 19 import java.net.Socket; 
 20 
 21  
 22 
 23 public class socket_service implements Runnable 
 24 
 25 {  
 26 
 27     public void run() 
 28 
 29     { 
 30 
 31        try 
 32 
 33         { 
 34 
 35             //创建ServerSocket 
 36 
 37             ServerSocket serverSocket = new ServerSocket(54321); 
 38 
 39             while (true) 
 40 
 41             { 
 42 
 43                //接受客户端请求 
 44 
 45                Socket client = serverSocket.accept(); 
 46 
 47                System.out.println("accept"); 
 48 
 49                 try 
 50 
 51                 { 
 52 
 53                     //接收客户端消息 
 54 
 55                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
 56 
 57                   
 58 
 59                   System.out.print("
");
 60 
 61                    String str = in.readLine(); 
 62 
 63                   System.out.println("read:" + str);   
 64 
 65                     //向服务器发送消息 
 66 
 67                    PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);       
 68 
 69                     out.println("server ");  
 70 
 71                    //关闭流 
 72 
 73                    out.close();  
 74 
 75                    in.close(); 
 76 
 77                } 
 78 
 79                 catch (Exception e) 
 80 
 81                 { 
 82 
 83                    System.out.println(e.getMessage()); 
 84 
 85                     e.printStackTrace(); 
 86 
 87                 } 
 88 
 89                 finally 
 90 
 91                 { 
 92 
 93                     //关闭 
 94 
 95                    client.close(); 
 96 
 97                    System.out.println("close"); 
 98 
 99                } 
100 
101             } 
102 
103        }  
104 
105        catch (Exception e) 
106 
107         { 
108 
109            System.out.println(e.getMessage()); 
110 
111        } 
112 
113     } 
114 
115     //main函数,开启服务器 
116 
117    public static void main(String args[]) 
118 
119    { 
120 
121         Thread desktopServerThread = new Thread(new socket_service()); 
122 
123        desktopServerThread.start(); 
124 
125   } 
126 
127 }

客户端建立

Activity01.java代码

  1 package com.example.socket;
  2 
  3  
  4 
  5 import java.io.BufferedReader; 
  6 
  7 import java.io.BufferedWriter; 
  8 
  9 import java.io.InputStreamReader; 
 10 
 11 import java.io.OutputStreamWriter; 
 12 
 13 import java.io.PrintWriter; 
 14 
 15 import java.net.Socket; 
 16 
 17  
 18 
 19 import android.app.Activity; 
 20 
 21 import android.os.Bundle; 
 22 
 23 import android.util.Log; 
 24 
 25 import android.view.View; 
 26 
 27 import android.view.View.OnClickListener; 
 28 
 29 import android.widget.Button; 
 30 
 31 import android.widget.EditText; 
 32 
 33 import android.widget.TextView; 
 34 
 35  
 36 
 37 public class Activity01 extends Activity 
 38 
 39 { 
 40 
 41     private final String        DEBUG_TAG   = "Activity01"; 
 42 
 43     
 44 
 45    private TextView    mTextView = null; 
 46 
 47     private EditText    mEditText = null; 
 48 
 49     private Button      mButton = null; 
 50 
 51     /** Called when the activity is first created. */ 
 52 
 53    @Override 
 54 
 55    public void onCreate(Bundle savedInstanceState) 
 56 
 57     { 
 58 
 59        super.onCreate(savedInstanceState); 
 60 
 61       setContentView(R.layout.main); 
 62 
 63         
 64 
 65        mButton = (Button)findViewById(R.id.Button01); 
 66 
 67        mTextView = (TextView)findViewById(R.id.TextView01); 
 68 
 69         mEditText = (EditText)findViewById(R.id.EditText01); 
 70 
 71          
 72 
 73         //登陆 
 74 
 75         mButton.setOnClickListener(new OnClickListener() 
 76 
 77        { 
 78 
 79            public void onClick(View v) 
 80 
 81            { 
 82 
 83                Socket socket = null; 
 84 
 85                String message = mEditText.getText().toString() + "/r/n";  
 86 
 87                 try  
 88 
 89                {    
 90 
 91                    //创建Socket 
 92 
 93                   socket = new Socket("192.168.1.2",54321);  
 94 
 95                     //socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,端口54321 
 96 
 97                    //向服务器发送消息 
 98 
 99                    PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);       
100 
101                   out.println(message+"wmy");  
102 
103                      
104 
105                    //接收来自服务器的消息 
106 
107                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
108 
109                    String msg = br.readLine();  
110 
111                      
112 
113                    if ( msg != null ) 
114 
115                    { 
116 
117                       mTextView.setText(msg); 
118 
119                  } 
120 
121                     else 
122 
123                   { 
124 
125                         mTextView.setText("数据错误!"); 
126 
127                     } 
128 
129                     //关闭流 
130 
131                    out.close(); 
132 
133                     br.close(); 
134 
135                     //关闭Socket 
136 
137                     socket.close();  
138 
139                } 
140 
141               catch (Exception e)  
142 
143                { 
144 
145                    // TODO: handle exception 
146 
147                   Log.e(DEBUG_TAG, e.toString()); 
148 
149                } 
150 
151             } 
152 
153        }); 
154 
155    } 
156 
157 } 

Socket_androidActivity.java代码

 1 package com.example.socket;
 2 
 3  
 4 
 5 import android.app.Activity;
 6 
 7 import android.os.Bundle;
 8 
 9  
10 
11 public class Socket_androidActivity extends Activity {
12 
13     /** Called when the activity is first created. */
14 
15     @Override
16 
17     public void onCreate(Bundle savedInstanceState) {
18 
19         super.onCreate(savedInstanceState);
20 
21         setContentView(R.layout.main);
22 
23     }
24 
25 }

Main.xml代码

 1 <?xml version="1.0" encoding="utf-8"?> 
 2 
 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 4 
 5     android:orientation="vertical" 
 6 
 7     android:layout_width="fill_parent" 
 8 
 9     android:layout_height="fill_parent" 
10 
11     > 
12 
13    <TextView   
14 
15     android:id="@+id/TextView01"  
16 
17     android:layout_width="fill_parent"  
18 
19     android:layout_height="wrap_content"  
20 
21     android:text="杩欓噷鏄剧ず鎺ユ敹鍒版湇鍔″櫒鍙戞潵鐨勪俊鎭� 
22 
23     /> 
24 
25     <EditText  
26 
27     android:id="@+id/EditText01"  
28 
29     android:text="杈撳叆瑕佸彂閫佺殑鍐呭�"  
30 
31     android:layout_width="fill_parent"  
32 
33     android:layout_height="wrap_content"> 
34 
35    </EditText> 
36 
37    <Button  
38 
39     android:id="@+id/Button01" 
40 
41     android:layout_width="fill_parent" 
42 
43     android:layout_height="wrap_content" 
44 
45     android:text="鍙戦�" 
46 
47     />   
48 
49 </LinearLayout> 

AndroidManifest.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 4 
 5     package="com.example.socket"
 6 
 7     android:versionCode="1"
 8 
 9     android:versionName="1.0" >
10 
11  
12 
13    <uses-sdk android:minSdkVersion="7" />
14 
15  
16 
17    <application
18 
19         android:icon="@drawable/ic_launcher"
20 
21         android:label="@string/app_name" >
22 
23         <activity
24 
25            android:name=".Activity01"
26 
27            android:label="@string/app_name" >
28 
29             <intent-filter>
30 
31                 <action android:name="android.intent.action.MAIN" />
32 
33  
34 
35                 <category android:name="android.intent.category.LAUNCHER" />
36 
37             </intent-filter>
38 
39         </activity>
40 
41    </application>
42 
43  <uses-permission android:name="android.permission.INTERNET"></uses-permission>
44 
45 </manifest>

开发好了就行测试吧

前后对比一下

服务器端:

参考原文:http://m.oschina.net/blog/75407

原文地址:https://www.cnblogs.com/tanghuian/p/4081082.html