本文介紹瞭如何使用Android與Servlet進行簡單交互,使App擁有自己的服務器。本文的技術主要是使用網絡連接來實現交互。
1.Android從服務器中下載字符串
Android端:
/**
* 接收服務端發送的字符串
*/
private void getDownStr(final String s) {
//android中無法進行耗時操作,這個操作應放在線程中
new Thread(){
@Override
public void run() {
//從網絡上獲取str
URL url= null;
try {
url = new URL(s);
Log.e("a",s);
//獲取網絡輸入流
URLConnection urlConnection=url.openConnection();
InputStream in= urlConnection.getInputStream();
Log.e("msg","出錯了");
//創建字符流讀取數據
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(in, "utf-8"));
String str=bufferedReader.readLine();
Log.e("str",str);
//關閉流
bufferedReader.close();
in.close();
//子線程無法更改UI界面,這裏使用Handler+Message的方式進行交互
//創建Message對象
Message message=new Message();
message.what=1;
message.obj=str;
//發送message
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
服務器端:
package net.xyz.connandroid;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 向客戶端傳輸字符串
* @author lenovo
*
*/
@WebServlet("/DownStr")
public class DownStr extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownStr() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
response.setContentType("text/html;charset=utf-8");
String str="張三:123456";
//獲取PrinterWriter對象
PrintWriter printWriter=response.getWriter();
//向客戶端發送數據
printWriter.write(str);
System.out.println("字符串發送完畢");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.Android從服務器端下載圖片
android:
/**
* 接收服務端發送的圖片
*/
private void getDownImg(final String s ) {
new Thread(){
@Override
public void run() {
try {
//獲取網絡上的資源
URL url=new URL(s);
URLConnection urlConnection=url.openConnection();
InputStream in=urlConnection.getInputStream();
//把輸入流解析成一個Bitmap對象
Bitmap bitmap= BitmapFactory.decodeStream(in);
//用message將bitmap對象顯示在客戶端
Message message=new Message();
message.what=2;
message.obj=bitmap;
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
服務器:
package net.xyz.connandroid;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 向客戶端發送圖片
*/
@WebServlet("/DownImgServlet")
public class DownImgServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownImgServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
response.setContentType("text/html;charset=utf-8");
//獲取本地輸入流讀取圖片,輸出流發送圖片
FileInputStream in=new FileInputStream("D:\\學習\\圖片\\1.jpg");
OutputStream out=response.getOutputStream();
//用字節流讀取文件
int len=-1;
while((len=in.read())!=-1) {
out.write(len);
}
//關閉連接
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3.客戶端向服務器上傳鍵值對信息(以url的方式傳送)
Andorid端
/**
* 向服務器發送鍵值對信息
*/
private void upKeyValue(final String s) {
new Thread(){
@Override
public void run() {
try {
//設置鍵值對信息
String keyValue="?name=張三&password=123";
Log.e("key",s+keyValue);
//獲取URL對象
URL url=new URL(s+keyValue);
//打開url連接
url.openStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
服務器端:
package net.xyz.connandroid;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 接收客戶端發送的鍵值對信息
*/
@WebServlet("/UpKeyValueServlet")
public class UpKeyValueServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UpKeyValueServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//獲取上傳的鍵值對信息
String name=request.getParameter("name");
String password=request.getParameter("password");
response.getWriter().write(name+":"+password);
System.out.println(name+":"+password);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
4.向服務器上傳字符串信息
Android端:
/**
* 向服務器提交敏感字符信息
*/
private void upStr(final String s) {
new Thread(){
@Override
public void run() {
try {
//使用URL和httpURLConnection進行網絡連接
URL url=new URL(s);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//設置編碼方式
conn.setRequestMethod("POST");
//獲取網絡輸出流
OutputStream outputStream=conn.getOutputStream();
//獲取待發送的字符串
String str=editText.getText().toString().trim();
outputStream.write(str.getBytes());
//必須要獲取網絡輸入流保證客戶端與服務端建立連接
conn.getInputStream();
outputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
服務器端:
package net.xyz.connandroid;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 接收客戶端發送的敏感字符串
*/
@WebServlet("/UpStr")
public class UpStr extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UpStr() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//獲取網絡輸入流
InputStream in=request.getInputStream();
//用字符流讀取數據
BufferedReader read=new BufferedReader(new InputStreamReader(in,"utf-8"));
String str=read.readLine();
if(str!=null) {
response.getWriter().write(str);
}
System.out.println(str);
in.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
5.向服務器端上傳圖片
Android端:
/**
* 向服務端上傳圖片信息
* @param s
*/
private void UpImg(final String s) {
new Thread(){
@Override
public void run() {
try {
URL url=new URL(s);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
//設置編碼方式
conn.setRequestMethod("POST");
//獲取輸入流
InputStream in=getResources().openRawResource(R.raw.fish);
//獲取網絡輸出流
OutputStream out=conn.getOutputStream();
//循環讀寫
int len=-1;
while((len=in.read())!=-1){
out.write(len);
}
//獲取連接
conn.getInputStream();
//關閉流
in.close();
out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
服務器端:
package net.xyz.connandroid;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 獲取客戶端上傳的圖片
*/
@WebServlet("/UpImg")
public class UpImg extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UpImg() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設置編碼方式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String path=this.getServletContext().getRealPath("/");
//獲取網絡輸入流
InputStream in=request.getInputStream();
//獲取本地輸出流
OutputStream out=new FileOutputStream(path+"b.jpg");
//循環讀寫
int len=-1;
while((len=in.read())!=-1) {
out.write(len);
}
//關閉流
out.close();
System.out.println("圖片接收完畢");
response.getWriter().write("OK");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}