基于TCP的Socket通信

这里的例程跟前面“基于TCP的Socket”类似,前面是客户端给服务器端发信息,这里是服务器端给客户端发信息

TCP通信模式:


TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信两端之间形成网络虚拟链路。

一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。

Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信。


SimpleServer.java  服务器程序,不需要建立Android项目,在PC机的cmd下直接运行即可

public class SimpleSever {


	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		ServerSocket ss = new ServerSocket(3002);
		while(true){
			Socket s = ss.accept();
			OutputStream os = s.getOutputStream();
			os.write("您好,圣诞节快乐~\n".getBytes("utf-8"));
			os.close();
			s.close();
		}
		
	}

}

SimpleClient.java 客户端程序,需要建立Android项目,一个文本框显示内容,一个按钮更新内容

public class SimpleClient extends Activity {

	private static final int COMPLETED = 0;
	private EditText show;
	private Button updateButton;
	
	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			if (msg.what == COMPLETED){
				show.setText("来自服务器的问候:\n\n"+msg.obj.toString());
			}
		}
		
	};
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		updateButton = (Button) findViewById(R.id.button);
		updateButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				show.setText("");
				new WorkThread().start();
				
			}
		});

		
	}
	private class WorkThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				Socket socket = new Socket("222.199.230.116",3002);
				BufferedReader br = new BufferedReader(
						new InputStreamReader(socket.getInputStream()));
				Message msg = new Message();
				msg.what = COMPLETED;
				msg.obj = br.readLine();
				handler.sendMessage(msg);	
				br.close();
				socket.close();
			}catch(IOException e){
				e.printStackTrace();
			}

		}
		
	}


}

在AndroidManifest需配置访问互联网的权限

<uses-permission android:name="android.permission.INTERNET"/>

注意:

1、上面程序的IP地址是服务器端所在主机的IP地址

在Android模拟器测试没有问题,在真机测试需保证网络稳定(用2G/3G通信易出现接收不到信息的情况,需要开WiFi)

2、在开始时,更新文本框内容的程序是写在WorkThread线程里,出现错误

Only the original thread that created a view hierarchy can touch its view

请教度娘,原因在于Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。

所以我们应该是在子线程中通知主线程,让主线程做更新操作吧。那么,我们如何通知主线程呢?我们需要使用到Handler对象,就如SimpleClient.java所用的方式

通过上面这种方式,我们就可以解决线程安全的问题,把复杂的任务处理工作交给子线程去完成,然后子线程通过handler对象告知主线程,

由主线程更新文本框内容,这个过程中Android消息机制起着重要的作用。新技能get,解决问题加深了理解~

在前面“Handler的使用”(http://blog.csdn.net/zhanhong39/article/details/41747199)简单提到了Handler的使用

详情见http://blog.csdn.net/liuhe688/article/details/6407225


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值