android之socket程式設計
阿新 • • 發佈:2019-01-10
package com.fanhua.communication; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; import java.util.Enumeration; import CFE.ST_MW_08S.communication.R; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.StrictMode; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { /** Called when the activity is first created. */ private Button startButton; private EditText IPText; private Button sendButtonClient; private Button sendButtonServer; private Button CreateButton; private EditText editMsgText, editMsgTextCilent; private TextView recvText; private Context mContext; private boolean isConnecting = false; private Thread mThreadClient = null; private Thread mThreadServer = null; private Socket mSocketServer = null; private Socket mSocketClient = null; static BufferedReader mBufferedReaderServer = null; static PrintWriter mPrintWriterServer = null; static BufferedReader mBufferedReaderClient = null; static PrintWriter mPrintWriterClient = null; private String recvMessageClient = ""; private String recvMessageServer = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; //StrictMode類 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build()); findViews(); registerListener(); // IPText.setText("10.0.2.15:"); IPText.setText("10.0.2.15:49806"); editMsgTextCilent.setText("ST-MW-08S"); editMsgText.setText("ST-MW-08S"); recvText.setMovementMethod(ScrollingMovementMethod.getInstance()); } //查詢控制元件 private void findViews(){ IPText = (EditText) findViewById(R.id.IPText); startButton = (Button) findViewById(R.id.StartConnect); editMsgTextCilent = (EditText) findViewById(R.id.clientMessageText); editMsgText = (EditText) findViewById(R.id.MessageText); sendButtonClient = (Button) findViewById(R.id.SendButtonClient); sendButtonServer = (Button) findViewById(R.id.SendButtonServer); CreateButton = (Button) findViewById(R.id.CreateConnect); recvText = (TextView) findViewById(R.id.RecvText); } //註冊監聽 private void registerListener(){ startButton.setOnClickListener(StartClickListener);//客戶端開始連線 sendButtonClient.setOnClickListener(SendClickListenerClient);//客戶端傳送資料 sendButtonServer.setOnClickListener(SendClickListenerServer);//伺服器傳送資料 CreateButton.setOnClickListener(CreateClickListener);//伺服器建立 } private OnClickListener StartClickListener = new OnClickListener() { @Override public void onClick(View arg0) { if (isConnecting) { isConnecting = false;//取反 try { if (mSocketClient != null) { mSocketClient.close(); mSocketClient = null; mPrintWriterClient.close(); mPrintWriterClient = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mThreadClient.interrupt(); startButton.setText("開始連線"); IPText.setEnabled(true); recvText.setText("資訊:\n"); } else { isConnecting = true; startButton.setText("停止連線"); IPText.setEnabled(false); mThreadClient = new Thread(mRunnable); mThreadClient.start(); } } }; private OnClickListener SendClickListenerClient = new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (isConnecting && mSocketClient != null) { String msgText = editMsgTextCilent.getText().toString();// 取得編輯框中我們輸入的內容 if (msgText.length() <= 0) { Toast.makeText(mContext, "傳送內容不能為空!", Toast.LENGTH_SHORT) .show(); } else { try { mPrintWriterClient.print(msgText);// 傳送給伺服器 mPrintWriterClient.flush();//重新整理 } catch (Exception e) { // TODO: handle exception Toast.makeText(mContext, "傳送異常:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } } else { Toast.makeText(mContext, "沒有連線", Toast.LENGTH_SHORT).show(); } } }; private OnClickListener SendClickListenerServer = new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (serverRuning && mSocketServer != null) { String msgText = editMsgText.getText().toString();// 取得編輯框中我們輸入的內容 if (msgText.length() <= 0) { Toast.makeText(mContext, "傳送內容不能為空!", Toast.LENGTH_SHORT) .show(); } else { try { mPrintWriterServer.print(msgText);// 傳送給客戶端 mPrintWriterServer.flush(); } catch (Exception e) { // TODO: handle exception Toast.makeText(mContext, "傳送異常:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } } else { Toast.makeText(mContext, "沒有連線", Toast.LENGTH_SHORT).show(); } } }; // 執行緒:監聽伺服器發來的訊息 private Runnable mRunnable = new Runnable() { public void run() { String msgText = IPText.getText().toString(); if (msgText.length() <= 0) { // Toast.makeText(mContext, "IP不能為空!", // Toast.LENGTH_SHORT).show(); recvMessageClient = "IP不能為空!\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); return; } int start = msgText.indexOf(":"); if ((start == -1) || (start + 1 >= msgText.length())) { recvMessageClient = "IP地址不合法\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); return; } String sIP = msgText.substring(0, start); String sPort = msgText.substring(start + 1); int port = Integer.parseInt(sPort); Log.d("gjz", "IP:" + sIP + ":" + port); try { // 連線伺服器 mSocketClient = new Socket(sIP, port); // portnum // 取得輸入、輸出流 mBufferedReaderClient = new BufferedReader( new InputStreamReader(mSocketClient.getInputStream())); mPrintWriterClient = new PrintWriter( mSocketClient.getOutputStream(), true); recvMessageClient = "已經連線server!\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); // break; } catch (Exception e) { recvMessageClient = "連線IP異常:" + e.toString() + e.getMessage() + "\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); return; } char[] buffer = new char[256]; int count = 0; while (isConnecting) { try { // if ( (recvMessageClient = // mBufferedReaderClient.readLine()) != null ) if ((count = mBufferedReaderClient.read(buffer)) > 0) { recvMessageClient = getInfoBuff(buffer, count) + "\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); } } catch (Exception e) { recvMessageClient = "接收異常:" + e.getMessage() + "\n";// 訊息換行 Message msg = new Message(); msg.what = 1; mHandler.sendMessage(msg); } } } }; Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { recvText.append("Server: " + recvMessageServer); // 重新整理 } else if (msg.what == 1) { recvText.append("Client: " + recvMessageClient); // 重新整理 } } }; // 建立服務端ServerSocket物件 private ServerSocket serverSocket = null; private boolean serverRuning = false; private OnClickListener CreateClickListener = new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (serverRuning) { serverRuning = false; try { if (serverSocket != null) { serverSocket.close(); serverSocket = null; } if (mSocketServer != null) { mSocketServer.close(); mSocketServer = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mThreadServer.interrupt(); CreateButton.setText("建立服務"); recvText.setText("資訊:\n"); } else { serverRuning = true; mThreadServer = new Thread(mcreateRunnable); mThreadServer.start(); CreateButton.setText("停止服務"); } } }; // 執行緒:監聽伺服器發來的訊息 private Runnable mcreateRunnable = new Runnable() { public void run() { try { serverSocket = new ServerSocket(0); SocketAddress address = null; if (!serverSocket.isBound()) { serverSocket.bind(address, 0); } getLocalIpAddress(); // 方法用於等待客服連線 mSocketServer = serverSocket.accept(); // 接受客服端資料BufferedReader物件 mBufferedReaderServer = new BufferedReader( new InputStreamReader(mSocketServer.getInputStream())); // 給客服端傳送資料 mPrintWriterServer = new PrintWriter( mSocketServer.getOutputStream(), true); // mPrintWriter.println("服務端已經收到資料!"); Message msg = new Message(); msg.what = 0; recvMessageServer = "client已經連線上!\n"; mHandler.sendMessage(msg); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); Message msg = new Message(); msg.what = 0; recvMessageServer = "建立異常:" + e.getMessage() + e.toString() + "\n";// 訊息換行 mHandler.sendMessage(msg); return; } char[] buffer = new char[256]; int count = 0; while (serverRuning) { try { // if( (recvMessageServer = // mBufferedReaderServer.readLine()) != null )//獲取客服端資料 if ((count = mBufferedReaderServer.read(buffer)) > 0) ; { recvMessageServer = getInfoBuff(buffer, count) + "\n";// 訊息換行 Message msg = new Message(); msg.what = 0; mHandler.sendMessage(msg); } } catch (Exception e) { recvMessageServer = "接收異常:" + e.getMessage() + "\n";// 訊息換行 Message msg = new Message(); msg.what = 0; mHandler.sendMessage(msg); return; } } } }; public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf .getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); // if (!inetAddress.isLoopbackAddress()) { // return inetAddress.getHostAddress(); // recvMessage = inetAddress.getHostAddress()+ // "isAnyLocalAddress: "+inetAddress.isAnyLocalAddress() // + // "isLinkLocalAddress: "+inetAddress.isLinkLocalAddress() // + // "isSiteLocalAddress: "+inetAddress.isSiteLocalAddress()+"\n"; // mHandler.sendMessage(mHandler.obtainMessage()); // if(inetAddress.isSiteLocalAddress()) { recvMessageServer += "請連線IP:" + inetAddress.getHostAddress() + ":" + serverSocket.getLocalPort() + "\n"; // Message msg = new Message(); // msg.what = 0; // mHandler.sendMessage(msg); } } } } } catch (SocketException ex) { recvMessageServer = "獲取IP地址異常:" + ex.getMessage() + "\n";// 訊息換行 Message msg = new Message(); msg.what = 0; mHandler.sendMessage(msg); } Message msg = new Message(); msg.what = 0; mHandler.sendMessage(msg); return null; } private String getInfoBuff(char[] buff, int count) { char[] temp = new char[count]; for (int i = 0; i < count; i++) { temp[i] = buff[i]; } return new String(temp); } public void onDestroy() { super.onDestroy(); if (isConnecting) { isConnecting = false; try { if (mSocketClient != null) { mSocketClient.close(); mSocketClient = null; mPrintWriterClient.close(); mPrintWriterClient = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mThreadClient.interrupt(); } if (serverRuning) { serverRuning = false; try { if (serverSocket != null) { serverSocket.close(); serverSocket = null; } if (mSocketServer != null) { mSocketServer.close(); mSocketServer = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mThreadServer.interrupt(); } } }