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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android天气预报实验报告模板 public class SetCityActivity extends Activity { //定义的一个自动定位的列表 private ListView gpsView; //定义的一个省份可伸缩性的列表 private ExpandableListView provinceList; //定义的用于过滤的文本输入框 private TextView filterText; //定义的一个记录城市码的SharedPreferences文件名 public static final String CITY_CODE_FILE="city_code"; //城市的编码 private String[][] cityCodes; //省份 private String[] groups; //对应的城市 private String[][] childs; //自定义的伸缩列表适配器 private MyListAdapter adapter; //记录应用程序widget的ID private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.set_city); gpsView = (ListView)findViewById(R.id.gps_view); provinceList= (ExpandableListView)findViewById(R.id.provinceList); //设置自动定位的适配器 gpsView.setAdapter(new GPSListAdapter(SetCityActivity.this)); //==============================GPS================================= //当单击自动定位时 gpsView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView localeCity = (TextView)view.findViewById(R.id.locateCityText); localeCity.setText("正在定位..."); final LocateHandler handler = new LocateHandler(localeCity); //添加一个线程来处理定位 new Thread(){ public void run() { Map<Integer, String> cityMap= getLocationCityInfo(); //记录匹配的城市的索引 int provinceIndex = -1; int cityIndex = -1; //传给处理类的数据封装对象 Bundle bundle = new Bundle(); if(cityMap!=null) { //得到图家名 String country = cityMap.get(LocationXMLParser.COUNTRYNAME); //只匹配中国地区的天气 if(country!=null&&country.equals("中国")){ //得到省 String province = cityMap.get(LocationXMLParser.ADMINISTRATIVEAREANAME); //得到市 String city = cityMap.get(LocationXMLParser.LOCALITYNAME); //得到区县 String towns = cityMap.get(LocationXMLParser.DEPENDENTLOCALITYNAME); Log.i("GPS", "============"+province+"."+city+"."+towns+"=============="); //将GPS定位的城市与提供能查天气的城市进行匹配 StringBuilder matchCity = new StringBuilder(city); matchCity.append("."); matchCity.append(towns); //找到省份 for(int i=0; i<groups.length; i++) { if(groups[i].equals(province)) { provinceIndex = i; break; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值