http://www.cnblogs.com/yangfengwu/p/8776712.html
先把源碼和資料鏈接放到這里
鏈接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA 密碼:nhn3
先做手機的,然后做C#的
詳細點的可以看我這篇文章,這篇文章會解決一些細節問題
http://www.cnblogs.com/yangfengwu/p/5212570.html
咱們不做很復雜的直接越簡單越好,就做成這樣
先編譯一下
不用管,后期的話咱會用一下
最后做成這樣子
發現還是有點大..
把像素低的放到像素高的里面圖片顯示出來會縮小,把像素高的放到像素低的里面圖片顯示出來會放大
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener);//設置SWITCH的狀態改變事件 } private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub // Toast.makeText(getApplicationContext(), isChecked+"", 500).show(); if (isChecked) {//切換圖片 imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } };
現在做點擊連接按鈕就連接服務器
有點迫不及待的想試一試騰訊雲了,
下面做的是:點擊連接按鈕,連接TCP服務器,連接上以后啟動數據接收任務,因為數據接收任務可以判斷是不是和服務器斷開了連接
然后按鈕顯示"斷開",如果意外斷開了連接也顯示斷開....
public class MainActivity extends Activity { ImageView imageViewLamp;//燈的圖片 Switch switchLamp;//燈的控制開關 EditText editTextIPAdress,editTextPort;//ip地址和端口號的編輯框 Button buttonConnect;//連接按鈕 Socket socket;//cocket boolean ConnectFlage = false;//連接標志,控制按鈕顯示連接和斷開 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一個連接任務的變量 InputStream inputStream;//獲取輸入流,可以用來判斷有沒有斷開連接 ThreadReadData threadReadData = new ThreadReadData();//接收數據的任務的變量 boolean threadReadDataFlage = false;//接收數據任務一直運行控制 byte[] ReadBuffer = new byte[1024];//存儲接收到的數據 int ReadBufferLengh = 0;//接收到的數據個數 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示燈控制開關*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); } else { imageViewLamp.setImageResource(R.drawable.ledoff); } } }; /*按鈕點擊連接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//啟動連接任務 } catch (Exception e) //預防任務還沒關閉呢又點擊開始 { threadConnectService.run(); } } else { ConnectFlage = true; buttonConnect.setText("連接"); try { socket.close();//關閉socket inputStream.close();//關閉數據流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 連接服務器的任務 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//獲取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//獲取端口號 socket = new Socket(ipAddress, port);//創建連接地址和端口 inputStream = socket.getInputStream();//獲得通道的數據流變量 threadReadDataFlage = true;//一直接收數據 try { threadReadData.start(); } catch (Exception e) {//預防任務還沒關閉呢又點擊開始 threadReadData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { ConnectFlage = false; buttonConnect.setText("斷開"); Toast.makeText(getApplicationContext(), "連接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收數據的任務 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服務器斷開會返回-1 if (ReadBufferLengh == -1) { threadReadDataFlage = false; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { ConnectFlage = true; buttonConnect.setText("連接"); Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); } } } } /** 當活動(界面)不再可見時調用 */ @Override protected void onStop() { threadReadDataFlage = false;//結束接收數據任務 super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
忘了說一件事情....加權限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yfw456.tcpclientdemo" android:versionCode="1" android:versionName="1.0" > <!-- 獲取手機信息權限 --> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>" <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"> </uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
我把上面做的打包了
好現在接着寫發數據(控制燈的亮滅)
public class MainActivity extends Activity { ImageView imageViewLamp;//燈的圖片 Switch switchLamp;//燈的控制開關 EditText editTextIPAdress,editTextPort;//ip地址和端口號的編輯框 Button buttonConnect;//連接按鈕 Socket socket;//cocket boolean ConnectFlage = true;//連接標志,控制按鈕顯示連接和斷開 ThreadConnectService threadConnectService = new ThreadConnectService();//建立一個連接任務的變量 InputStream inputStream;//獲取輸入流,可以用來判斷有沒有斷開連接 OutputStream outputStream;//獲得輸出流 ThreadReadData threadReadData = new ThreadReadData();//接收數據的任務 ThreadSendData threadSendData = new ThreadSendData();//發送數據的任務 boolean threadReadDataFlage = false;//接收數據任務一直運行控制 boolean threadSendDataFlage = false;//接收數據任務一直運行控制 byte[] ReadBuffer = new byte[1024];//存儲接收到的數據 byte[] SendBuffer = new byte[1024];//存儲發送的數據 int ReadBufferLengh = 0; int SendDataCnt = 0;//控制發送數據的個數 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextIPAdress = (EditText) findViewById(R.id.editText1); editTextPort = (EditText) findViewById(R.id.editText2); buttonConnect = (Button) findViewById(R.id.button1); buttonConnect.setOnClickListener(buttonConnectClick); imageViewLamp = (ImageView) findViewById(R.id.imageView1); switchLamp = (Switch) findViewById(R.id.switch1); switchLamp.setOnCheckedChangeListener(switchLamplistener); } /*指示燈控制開關*/ private OnCheckedChangeListener switchLamplistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { imageViewLamp.setImageResource(R.drawable.ledon); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = (byte) 0xff; } else { imageViewLamp.setImageResource(R.drawable.ledoff); SendBuffer[0] = (byte) 0xaa; SendBuffer[1] = 0x55; SendBuffer[2] = 0x02; SendBuffer[3] = 0x00; } SendDataCnt = 4;//控制發送數據的個數 } }; /*按鈕點擊連接事件*/ private OnClickListener buttonConnectClick = new OnClickListener() { @Override public void onClick(View v) { if (ConnectFlage) { try { threadConnectService.start();//啟動連接任務 } catch (Exception e) //預防任務還沒關閉呢又點擊開始 { threadConnectService.run(); } } else { ConnectFlage = true; threadSendDataFlage = false;//關掉發送任務,預防產生多的任務 threadReadDataFlage = false;//關掉接收任務,預防產生多的任務 buttonConnect.setText("連接"); try { socket.close();//關閉socket inputStream.close();//關閉數據流 } catch (Exception e) { // TODO: handle exception } } } }; /** * 連接服務器的任務 * @author yang * */ class ThreadConnectService extends Thread { public void run() { InetAddress ipAddress; try { ipAddress = InetAddress.getByName(editTextIPAdress.getText().toString());//獲取IP地址 int port =Integer.valueOf(editTextPort.getText().toString());//獲取端口號 socket = new Socket(ipAddress, port);//創建連接地址和端口 inputStream = socket.getInputStream();//獲得通道的數據流 outputStream = socket.getOutputStream();//獲得通道的輸出流 threadReadDataFlage = true;//一直接收數據 threadSendDataFlage = true;//一直循環的判斷是否發送數據 try { threadReadData.start(); } catch (Exception e) {//預防任務還沒關閉呢又點擊開始 threadReadData.run(); } try { threadSendData.start(); } catch (Exception e) { threadSendData.run(); } runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { ConnectFlage = false; buttonConnect.setText("斷開"); Toast.makeText(getApplicationContext(), "連接成功", 500).show(); } }); } catch (Exception e) { e.printStackTrace(); } } } /** * 接收數據的任務 * @author yang * */ class ThreadReadData extends Thread { public void run() { while (threadReadDataFlage) { try { ReadBufferLengh = inputStream.read(ReadBuffer);//服務器斷開會返回-1 if (ReadBufferLengh == -1) { threadSendDataFlage = false;//關掉發送任務,預防產生多的任務 threadReadDataFlage = false;//關掉接收任務,預防產生多的任務 SendDataCnt = 0;//清零發送的個數 ConnectFlage = true; runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { buttonConnect.setText("連接"); Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show(); } }); } } catch (Exception e) { // TODO Auto-generated catch block Log.e("error", ReadBufferLengh+""); e.printStackTrace(); runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { buttonConnect.setText("連接"); Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//關掉發送任務,預防產生多的任務 threadReadDataFlage = false;//關掉接收任務,預防產生多的任務 SendDataCnt = 0;//清零發送的個數 } } } } /** * 發送數據任務 * @author yang * */ class ThreadSendData extends Thread { public void run() { while (threadSendDataFlage) { if (SendDataCnt>0) //要發送的數據個數大於0 { try { outputStream.write(SendBuffer,0,SendDataCnt);//發送數據 SendDataCnt = 0;//清零發送的個數 } catch (Exception e) { runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用 public void run() { buttonConnect.setText("連接"); Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show(); } }); ConnectFlage = true; threadSendDataFlage = false;//關掉發送任務,預防產生多的任務 threadReadDataFlage = false;//關掉接收任務,預防產生多的任務 SendDataCnt = 0; } } } } } /** 當活動(界面)不再可見時調用 */ @Override protected void onStop() { threadReadDataFlage = false;//結束接收數據任務 threadSendDataFlage = false;//結束發送數據任務 SendDataCnt = 0; super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
發送數據是寫在了一個任務里面
整體的源碼
本來想這一節也寫好C#的,不過感覺寫的夠多的了,所以C#的放到下一節
下一篇
http://www.cnblogs.com/yangfengwu/p/8785516.html