【Android笔记】Android与服务器通信 http和socket两种形式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Android笔记】Android与服务器通信 http和socket两种形式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含18233字,纯文字阅读大概需要27分钟。
内容图文
![【Android笔记】Android与服务器通信 http和socket两种形式](/upload/InfoBanner/zyjiaocheng/1296/ee99b853d2b54878a5daae44740d8f0d.jpg)
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/**2728 * Default constructor. 2930*/3132public EncodingFilter() { 333435 } 3637/**3839 * @see Filter#destroy() 4041*/4243publicvoid destroy() { 4445 } 464748/**4950 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 5152*/5354publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 5556 HttpServletRequest req = (HttpServletRequest) request; 57585960if("GET".equals(req.getMethod())){ 6162 EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(req); 6364 chain.doFilter(wrapper, response); 6566 } else {//post6768 req.setCharacterEncoding("UTF-8"); 6970 chain.doFilter(request, response); 7172 } 7374 } 7576/**7778 * @see Filter#init(FilterConfig) 7980*/8182publicvoid init(FilterConfig fConfig) throws ServletException { 838485 } 8687 }
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 { 2223privatestaticfinallong serialVersionUID = 1L; 2425/**2627 * @see HttpServlet#HttpServlet() 2829*/3031public servlet() { 3233super(); 3435 } 3637/**3839 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 4041*/4243protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 4445 String title = request.getParameter("title"); 4647 EncodingHttpServletRequest requsete = new EncodingHttpServletRequest(request); 4849 String titlee = requsete.getParameter("title"); 5051//把客户端传递过来的参数进行重新编码使之能支持中文5253 title = new String(title.getBytes("GB2312"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作5455 String timelength = request.getParameter("timelength"); 5657 System.out.println("视频名称:"+titlee); 5859 System.out.println("播放时长:"+timelength); 6061 } 6263/**6465 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 6667*/6869protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 7071 String title = request.getParameter("title"); 7273//把客户端传递过来的参数进行重新编码使之能支持中文7475 title = new String(title.getBytes("GB2312"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作7677 String timelength = request.getParameter("timelength"); 7879 System.out.println("视频名称:"+title); 8081 System.out.println("播放时长:"+timelength); 8283 } 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>1011<servlet-name>servlet</servlet-name>1213<url-pattern>/servlet</url-pattern>1415</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 8publicvoid onCreate(Bundle savedInstanceState) { 910super.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; 1617 @Override 18publicvoid onCreate(Bundle savedInstanceState) { 1920super.onCreate(savedInstanceState); 21 setContentView(R.layout.main); 2223 titleText = (EditText) this.findViewById(R.id.title); 24 lengthText = (EditText) this.findViewById(R.id.timelength); 25 button = (Button) this.findViewById(R.id.button); 26 } 2728publicvoid save(View v) throws Exception{ 2930 String title = titleText.getText().toString(); 31 String timelength = lengthText.getText().toString(); 3233boolean result = NewsService.save(title,timelength); 3435if(result){ 3637 Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show(); 3839 } 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 */privatestaticboolean 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){ returntrue; } returnfalse; } /** * 放松post请求 * @param path 请求路径 * @param params 请求参数 * @param encoding 编码 * @return 请求是否成功 */privatestaticboolean 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协议的任何一个属性时才能把请求发送出去returntrue; } returnfalse; } /** * 发送GET请求 * @param path 请求路径 * @param params 请求参数 * @return 请求是否成功 * @throws Exception */privatestaticboolean 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){ returntrue; } returnfalse; } }
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 27publicvoid run() 28 29 { 30 31try 32 33 { 34 35//创建ServerSocket 36 37 ServerSocket serverSocket = new ServerSocket(54321); 38 39while (true) 40 41 { 42 43//接受客户端请求 44 45 Socket client = serverSocket.accept(); 46 47 System.out.println("accept"); 48 49try 50 51 { 52 53//接收客户端消息 54 55 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 56 57 58 59 System.out.print("\n"); 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 79catch (Exception e) 80 81 { 82 83 System.out.println(e.getMessage()); 84 85 e.printStackTrace(); 86 87 } 88 89finally 90 91 { 92 93//关闭 94 95 client.close(); 96 97 System.out.println("close"); 98 99 } 100101 } 102103 } 104105catch (Exception e) 106107 { 108109 System.out.println(e.getMessage()); 110111 } 112113 } 114115//main函数,开启服务器 116117publicstaticvoid main(String args[]) 118119 { 120121 Thread desktopServerThread = new Thread(new socket_service()); 122123 desktopServerThread.start(); 124125 } 126127 }
客户端建立
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 41privatefinal String DEBUG_TAG = "Activity01"; 42 43 44 45private TextView mTextView = null; 46 47private EditText mEditText = null; 48 49private Button mButton = null; 50 51/** Called when the activity is first created. */ 52 53 @Override 54 55publicvoid onCreate(Bundle savedInstanceState) 56 57 { 58 59super.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 79publicvoid onClick(View v) 80 81 { 82 83 Socket socket = null; 84 85 String message = mEditText.getText().toString() + "/r/n"; 86 87try 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); 100101 out.println(message+"wmy"); 102103104105//接收来自服务器的消息 106107 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 108109 String msg = br.readLine(); 110111112113if ( msg != null ) 114115 { 116117 mTextView.setText(msg); 118119 } 120121else122123 { 124125 mTextView.setText("数据错误!"); 126127 } 128129//关闭流 130131 out.close(); 132133 br.close(); 134135//关闭Socket 136137 socket.close(); 138139 } 140141catch (Exception e) 142143 { 144145// TODO: handle exception 146147 Log.e(DEBUG_TAG, e.toString()); 148149 } 150151 } 152153 }); 154155 } 156157 }
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 { 1213/** Called when the activity is first created. */1415 @Override 1617publicvoid onCreate(Bundle savedInstanceState) { 1819super.onCreate(savedInstanceState); 2021 setContentView(R.layout.main); 2223 } 2425 }
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
原文:http://www.cnblogs.com/tanghuian/p/4081082.html
内容总结
以上是互联网集市为您收集整理的【Android笔记】Android与服务器通信 http和socket两种形式全部内容,希望文章能够帮你解决【Android笔记】Android与服务器通信 http和socket两种形式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。