首页 > 代码库 > 基于TCP的Socket通信

基于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


基于TCP的Socket通信