1. 程式人生 > >android之socket程式設計

android之socket程式設計

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();
		}
	}
}