基于TCP的Socket通信

来源:互联网 发布:java shiro盐值加密 编辑:程序博客网 时间:2024/05/02 01:37

这里的例程跟前面“基于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 stubServerSocket 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());}}};@Overrideprotected 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshow.setText("");new WorkThread().start();}});}private class WorkThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubtry{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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水泡破了感染了怎么办 夏天腋下出汗会弄湿衣服怎么办 夏天腋下出汗多弄湿衣服怎么办 上眼皮干燥起皮怎么办 怀孕下面湿又痒怎么办 内裤穿久了有异味怎么办 刨腹产私处捂烂了怎么办 猫咬手指出血了怎么办 老有白带涌出来怎么办 耳朵里塞了珠子怎么办 树脂发光字烧了怎么办 马蹄莲长得太高怎么办 百合球的芽断了怎么办 种的百合开败怎么办 盆栽百合花开完之后怎么办 土养百合花谢了怎么办 多肉叶子不饱满怎么办 冬天富贵竹叶子发黄怎么办水养 富贵竹叶子发黄怎么办水养 水养富贵竹有虫怎么办 水养的富贵竹叶子发黄怎么办 百合花水里的盐放多了怎么办 芦荟叶子发黄干瘪了怎么办 水插百合不开花怎么办 干百合冷水泡了怎么办 牡丹籽油过期了怎么办 ps画布建小了怎么办 腰突然疼的受不了了怎么办 微信里面打不开表格怎么办? 浏览器未正常加载相关控件怎么办 猫的眼睛发炎了怎么办 橡胶手机壳松了怎么办 橡胶手机壳小了怎么办 苹果手机下载不了软件了怎么办 苹果手机浏览器下载不了软件怎么办 小狗吃了硬的棉花怎么办 小狗吃了隔尿垫里的棉花怎么办 眼睫毛掉进眼睛里怎么办 爱掉头发怎么办吃什么 头皮屑多头发干燥脱发怎么办 剪了头发后悔了怎么办