android客戶端與部署到tomcat的servlet伺服器之間實現http通訊
阿新 • • 發佈:2019-01-24
博主目前小白,為了完成這個踩到不少地雷,在此處記錄下,可能錯誤忘記了,以後想起來再更新。
伺服器端:
public class Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getOutputStream().print("This is Servlet " );
}
}
}
在tomcat上部署專案時,輸入http://localhost:8080/專案名稱/servlet名稱,看到自己的寫的servlet就成功了,如果出現500錯誤,描述裡說是過濾器什麼的,很大的原因是缺少包,少什麼匯入什麼就行。
不要忘記在web.xml中建立servlet
<servlet>
<servlet-name>Servlet</servlet-name>//就是那個繼承httpservlet的類名
<servlet-class>com.example.Servlet</servlet-class >//那個servlet類的在scr下的檔案地址
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/Servlet</url-pattern>//也是類名。不要忘了斜槓
</servlet-mapping>
這就好了。有關tomcat 和eclipse 的配置就不多說了,百度下教程很多。
下面是android客戶端:
public class MainActivity extends Activity {
private TextView textView;
private connect connectThread;
private String result1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
connectThread = new connect();
connectThread.start();
try {
Thread.currentThread().sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
這裡要重點說明的是那個connect類的物件connectThread,可以看出這是個執行緒。
之所以建個子執行緒是因為剛開始我直接在onCreate裡連線的時候一直被堵塞導致app掛掉。。就是刷到真機上點開就閃退。查過很多資料,也有很多人發了跟我一樣的問題。我最終是用子執行緒的方式解決的。
因為很多人是看書或者是一些老的demo學習的,所以會進入困境,由於sdk升級,android4.3以上的手機好像不能在主執行緒裡進行網路操作。
下面是子執行緒類:
public class connect extends Thread {
int count = 0;
private String string_url = "http://172.27.163.4:8080/http_server/Servlet";//ip 要自行修改 手機和電腦在同一個區域網下。因為我沒有可用的外網伺服器,是將PC作為伺服器的。
private URL url = null;
String result;
String readline;
public connect() {
super();
System.out.println("建立子執行緒end");
}
public void run() {
super.run();
System.out.println("get方法begin");
this.getconnect();
System.out.println("get方法end");
//count++;
//System.out.println("" + count);這兩行我剛開始是為了測試這個執行緒的執行情況的。因為還是新手,多試試能記得牢
}
public void getconnect() {
try {
url = new URL(string_url);
System.out.println("11111111111");
HttpURLConnection connect_url = (HttpURLConnection) url.openConnection();
connect_url.setDoOutput(true);
connect_url.setDoInput(true);
connect_url.setConnectTimeout(10000);
connect_url.setRequestMethod("GET");
connect_url.connect();
System.setProperty("http.keepAlive", "false");
InputStreamReader in = new InputStreamReader(connect_url.getInputStream(), "utf-8");
System.out.println("22222222222");
BufferedReader reader = new BufferedReader(in);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
reader.close();
result = sb.toString();
in.close();
connect_url.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可能會比較亂,有很多沒提到。
像,我寫這個的時候用了json解析。程式碼沒貼上來,時間關係,下次再更新。android端的json 我開始的時候犯了個錯誤,原來伺服器端的json的包是匯入的。我順手也匯入了android端,結果閃退了,原因是android自己本身就是有關於json的jar的,兩個包同時存在的話裡面的類會打架導致出錯。刪掉後來導進去的就好了。
還碰到一些問題,我後續學習中有想起來的話就再加進去。