基于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
- 基于TCP的Socket通信
- 基于TCP的socket通信
- 基于TCP的Socket通信
- C#基于TCP的Socket通信
- 基于ipv6的socket通信(TCP)
- 基于tcp的简单socket通信
- 基于TCP的简单socket通信
- IOS socket基于tcp/udp的通信
- C#基于TCP的Socket通信
- 基于tcp的socket通信程序
- 基于tcp和udp的socket通信
- 基于TCP协议的Socket通信
- Java基于TCP/IP的Socket通信
- Java中基于TCP的Socket通信
- IOS socket基于tcp/udp的通信
- 基于TCP通信的套接字Socket
- 基于TCP协议的Socket通信
- 基于TCP的Socket通信传文件
- 适配器模式
- Android 程序打包及签名
- 唐巧的iOS技术博客好文列表
- vs2010打开vs2013工程
- OC存取器的指示符详解
- 基于TCP的Socket通信
- IAR 工程改名
- solr删除全部索引数据
- 通用权限管理设计 之 数据库结构设计
- Unity3D教程:动画系统教程
- 谷歌关键字一枚
- 第17周 项目7 结构体电子词典
- mysql部分查询功能
- C实现输入学生数学成绩计算平均分及及格率