編輯:關於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();
}
Android開發從相機或相冊獲取圖片裁剪
廢話不多說了,直接給大家貼代碼了。package com.only.android.app;import java.io.File;import android.app.
【自定義View系列】04--談談事件分發
引言:這部分會分三個模塊來講,先講View對Touch的處理,再講ViewGroup的事件分發,最後講如何解決滑動沖突。我習慣通過在源碼中添加注釋來理解源碼,以下是我提取
Android自定義控件系列:詳解onMeasure-利用onMeasure測量來實現圖片拉伸永不變形,解決屏幕適配問題
使用ImageView會遇到的問題 在Android應用中,都少不了圖片的顯示,ImageView,輪播圖,ViewPager等等,很多
android:Activity數據傳遞之靜態變量
使用Intent可以很方便在不同activity之間傳遞數據,這個也是官方推薦的方式,但是也有一定的局限性就是Intent無法傳遞不能序列化的對象,我們可以使用靜態變量來