編輯:關於Android編程
客戶端通常可以使用Socket的構造器來鏈接到指定的服務器。
下面演示一下,Android端鏈接到服務器,同時,用服務器給Android發送一條消息:
1)服務器端
2)Android端
1)服務器端
編寫過程中遇到的一個小問題:java.net.BindException: Address already in use: JVM_Bind,分析出現這個問題的原因,一般有如下幾種:
①)原因:端口已被占用。
解決方案:換一個端口。
②)原因:變量定義位置問題(我不知道是不是這個問題,可能是,我開始出現這個問題的時候,換了幾個端口還是沒解決,後來我將變量定義在外面,就解決了)
解決方案:將變量定義在外部。
package dujun.king.javaee; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class CServer { public static void main(String[] args){ //創建一個ServerSocket,用於監聽客戶端Socket的鏈接請求 //本機IP: 169.254.49.31 ServerSocket ss=null; Socket s = null; OutputStream os = null; //采用循環不斷的接受來自客戶端的請求 while (true) { try { System.out.println(等待客戶端的鏈接....); ss = new ServerSocket(9527); //每當接收到客戶端Socket的請求,服務器也對應產生一個Socket s = ss.accept(); System.out.println(客戶端已鏈接....); os = s.getOutputStream(); os.write(您好,收到一條信息!.getBytes(utf-8)); //關閉輸出流,關閉Socket os.close(); s.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } } }2)Android端
編寫過程中遇到的一個小問題,就是(我用真機)一直連接不上服務器,我當時以為不是ip地址的問題,我先後換了好幾個都沒用(包括我聯網後的ip 113.132.174.158,沒聯網時的ip 169.254.49.31)。
解決方案:添加一個模擬器,不用真機模擬。(使用:169.254.49.31 測試成功,如下圖)
a) xml布局代碼:
b)MainActivity.java代碼:
package client.dujun.king.tcp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; public class MainActivity extends Activity { EditText show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show = (EditText)findViewById(R.id.show); new Thread() { @Override public void run() { try { //建立連接到遠程服務器的Socket Socket socket = new Socket(169.254.49.31,9527); //將Socket對應的輸入流包裝成BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //進行普通的I/O操作 String line = br.readLine(); show.setText(來自服務器的數據:+line); br.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }c) AndroidMainiFest.xml 權限設置代碼:
本文實例講述了Android編程實現自定義ProgressBar樣式。分享給大家供大家參考,具體如下:效果圖如下,本例中設置了第一級進度條和第二級進度條。樣式資源:pro
只是一個簡單的handler的例子,目的就是對handler有一個初步的接觸。 在layout上添加一個button,點擊按鈕,然後打印出利用handler傳送的數據。(
API IntroductionContent providers are one of the primary building blocks(構件) of Andro
在移動互聯網,鏈接是比較重要的傳播媒質,但很多時候我們又希望用戶能夠回到APP中,這就要求APP可以通過浏覽器或在微信中被方便地喚起。這是一個既直觀又很好的用戶體驗,但在