編輯:關於Android編程
socket編程是網絡通信的一個基礎應用,無論是手機端還是PC端都需要socket技術來建立網絡通信。在本章小編主要從以下幾個方面來介紹socket的相關知識:
分別是“什麼是socket?”,“socket有什麼特點?”,“socket與Http以及TCP的區別”,“移動端socket的Demo”。寫的不好的地方請大家批評指正。
android:id=@+id/btn_conn/>布局效果如下:
package com.example.mysocketdemo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import android.os.Build; public class MainActivity extends Activity { private TextView tv; private Button btnsent,btnconn; private EditText ed_message; private OutputStream output; private Socket clientSocket; private Handler mHandler; private MyThread mythread; boolean stop = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()) .commit(); } init(); //onClickEvent---connect btnconn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { clientSocket = new Socket(127.0.0.1, 8888); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Toast.makeText(getApplicationContext(), connect ok, Toast.LENGTH_SHORT).show(); //把socket綁定到自己的線程對象 try { mythread = new MyThread(clientSocket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mythread.start();//啟動線程 //更新UI,大部分的數據工作已經交給了mythread對象 btnsent.setEnabled(true); btnconn.setEnabled(false); stop = false; } }); //sent Message btnsent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //當點擊按鈕時,會獲取編輯框中的數據,然後提交給線程 //先將發送內容進行打包 byte[] msgBuffer = null; try { msgBuffer = ed_message.getText().toString().getBytes(GB2312); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } //打包完成之後,添加socket的輸出流對象 try { output = clientSocket.getOutputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //輸出流對象將字節寫入 //無論是輸出流還是輸入流,操作的都是字節,如果向變成字符串,需要自己構建String對象 output.write(msgBuffer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Toast.makeText(getApplicationContext(), 發送成功, Toast.LENGTH_SHORT).show(); ed_message.setText(); } }); //在連接和發送數據之後,接下來就是處理了,發送的數據會通過message的方式傳遞到消息隊列,再由handl進行獲取 mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { tv.setText(msg.obj.toString()); }; }; } public void init() { tv = (TextView) findViewById(R.id.tv); btnsent = (Button) findViewById(R.id.btn_sent); ed_message = (EditText) findViewById(R.id.et_message); btnconn = (Button) findViewById(R.id.btn_conn); btnconn.setEnabled(true); btnsent.setEnabled(false); } //自定義線程類; private class MyThread extends Thread{ //構建自己的socket對象,用來在線程內使用 private Socket socket; private byte[] buf = null; private InputStream inputstream; String str = null; public MyThread(Socket socket) throws IOException { this.socket = socket; inputstream = this.socket.getInputStream(); } @Override public void run() { // TODO Auto-generated method stub while(!stop) { buf = new byte[512]; //將inputstream內的數據讀到buf裡 try { this.inputstream.read(buf); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { //將buf裡的字符流進行解析,得到 this.str = new String(buf, GB2312).trim(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } //線程內獲取了來自socket的Inputstream字節流,並且轉換成字符串後,線程就獲取了消息的實體內容 //此時線程將執行自己的一個使命,就是創建消息,並發送出去 Message msg = new Message(); msg.obj = this.str; mHandler.sendMessage(msg); } } } @Override protected void onDestroy() { // TODO Auto-generated method stub if (mythread!=null) { mythread.interrupt(); } super.onDestroy(); }
廢話不多說了,直接給大家貼代碼了。package com.only.android.app;import java.io.File;import android.app.
引言:這部分會分三個模塊來講,先講View對Touch的處理,再講ViewGroup的事件分發,最後講如何解決滑動沖突。我習慣通過在源碼中添加注釋來理解源碼,以下是我提取
使用ImageView會遇到的問題 在Android應用中,都少不了圖片的顯示,ImageView,輪播圖,ViewPager等等,很多
使用Intent可以很方便在不同activity之間傳遞數據,這個也是官方推薦的方式,但是也有一定的局限性就是Intent無法傳遞不能序列化的對象,我們可以使用靜態變量來