首页 > 代码库 > 基于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通信