Android进程间通信之socket通信
用Java中的socket编程。
通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上。
Server端:
ServerLastly.java
package com.example.driverexam; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; import android.os.Handler;
import android.os.Message;
import android.util.Log; /**
* 通过Socket实现
* @author Administrator
*
*/
public class ServerLastly implements Runnable{
private static final String TAG="ServerLastly";
ServerSocket server;
Socket client;
PrintWriter os;
BufferedReader is; Handler handler; /**
* 此处不将连接代码写在构造方法中的原因:
* 我在activity的onCreate()中创建示例,如果将连接代码 写在构造方法中,服务端会一直等待客户端连接,界面没有去描绘,会一直出现白屏。
* 直到客户端连接上了,界面才会描绘出来。原因是构造方法阻塞了主线程,要另开一个线程。在这里我将它写在了run()中。
*/
ServerLastly(Handler handler){
this.handler=handler;
// Log.i(TAG, "Server=======打开服务=========");
// try {
// server=new ServerSocket(8888);
// client=server.accept();
// Log.i(TAG, "Server=======客户端连接成功=========");
// InetAddress inetAddress=client.getInetAddress();
// String ip=inetAddress.getHostAddress();
// Log.i(TAG, "===客户端ID为:"+ip);
// os=new PrintWriter(client.getOutputStream());
// is=new BufferedReader(new InputStreamReader(client.getInputStream()));
//
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
} //发数据
public void send(String data){
if (os!=null) {
os.println(data);
os.flush();
}
} //接数据
@Override
public void run() {
Log.i(TAG, "Server=======打开服务=========");
try {
server=new ServerSocket(8080);
client=server.accept();
Log.i(TAG, "Server=======客户端连接成功=========");
InetAddress inetAddress=client.getInetAddress();
String ip=inetAddress.getHostAddress();
Log.i(TAG, "===客户端ID为:"+ip);
os=new PrintWriter(client.getOutputStream());
is=new BufferedReader(new InputStreamReader(client.getInputStream())); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} String result="";
while(true){
try {
result=is.readLine();
Log.i(TAG, "服务端接到的数据为:"+result);
//把数据带回activity显示
Message msg=handler.obtainMessage();
msg.obj=result;
msg.arg1=0x11;
handler.sendMessage(msg); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public void close(){
try {
if (os!=null) {
os.close();
}
if (is!=null) {
is.close();
}
if(client!=null){
client.close();
}
if (server!=null) {
server.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
ServerFinallyActivity.java
package com.example.driverexam; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class ServerFinallyActivity extends Activity { EditText et_serverSend;
TextView tv_showReceiveData; // ServerFinally server; ServerLastly server;
StringBuffer receiveData=new StringBuffer(); Handler handler=new Handler(new Handler.Callback() { @Override
public boolean handleMessage(Message msg) {
if (msg.arg1==0x11) {
receiveData.append((String)msg.obj);
tv_showReceiveData.setText(receiveData);
receiveData.append("\r\n");
} return false;
}
}); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_server_finally);
et_serverSend=(EditText) findViewById(R.id.et_serverSend);
tv_showReceiveData=(TextView) findViewById(R.id.tv_showReceiveData); // server=new ServerFinally();
// new Thread(server).start(); server=new ServerLastly(handler);
new Thread(server).start(); } //发数据
public void btn_serverSend(View view){
server.send(et_serverSend.getText().toString()+"");
et_serverSend.setText("");
} @Override
protected void onDestroy() {
super.onDestroy();
server.close();
} }
Client端:
ClientLastly.java
package com.fqhx.remoteserviceclient; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; import android.os.Handler;
import android.os.Message;
import android.util.Log; /**
* 通过socket实现
* @author Administrator
*
*/
public class ClientLastly implements Runnable{
private static final String TAG="ClientLastly";
private static final String NAME="com.repackaging.localsocket";
private int timeout=30000;
Socket client;
PrintWriter os;
BufferedReader is; Handler handler; ClientLastly(Handler handler){
this.handler=handler;
// try {
// //连接服务器
// client=new Socket("localhost", 8888);
// Log.i(TAG, "Client=======连接服务器成功=========");
// client.setSoTimeout(timeout);
// os=new PrintWriter(client.getOutputStream());
// is=new BufferedReader(new InputStreamReader(client.getInputStream()));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
} //发数据
public void send(String data){
Log.i(TAG, "Client=======data=========");
if (os!=null) {
os.println(data);
os.flush();
}
} //接收据
@Override
public void run() {
try {
//连接服务器
// client=new Socket("192.168.191.1", 8080);
client=new Socket("localhost", 8080);
Log.i(TAG, "Client=======连接服务器成功=========");
client.setSoTimeout(timeout);
os=new PrintWriter(client.getOutputStream());
is=new BufferedReader(new InputStreamReader(client.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} String result="";
while(true){
try {
result=is.readLine();
Log.i(TAG, "客户端接到的数据为:"+result);
//将数据带回acitvity显示
Message msg=handler.obtainMessage();
msg.arg1=0x12;
msg.obj=result;
handler.sendMessage(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } public void close(){
try {
if (os!=null) {
os.close();
}
if (is!=null) {
is.close();
}
if(client!=null){
client.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
ClientFinallyActivity.java
package com.fqhx.remoteserviceclient; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class ClientFinallyActivity extends Activity { // ClientFinally client;
EditText et_clientSend;
TextView tv_showReceiveDataClient; ClientLastly client;
StringBuffer receiveData=new StringBuffer(); Handler handler=new Handler(new Handler.Callback() { @Override
public boolean handleMessage(Message msg) {
if (msg.arg1==0x12) {
receiveData.append((String)msg.obj);
tv_showReceiveDataClient.setText(receiveData);
receiveData.append("\r\n");
} return false;
}
}); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_finally); et_clientSend=(EditText) findViewById(R.id.et_clientSend);
tv_showReceiveDataClient=(TextView) findViewById(R.id.tv_showReceiveDataClient); // client=new ClientFinally();
// new Thread(client).start(); client=new ClientLastly(handler);
new Thread(client).start();
} public void btn_clientSend(View view){
client.send(et_clientSend.getText().toString()+"");
et_clientSend.setText("");
} @Override
protected void onDestroy() {
super.onDestroy();
client.close();
}
}
Android进程间通信之socket通信的更多相关文章
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...
- Android进程间通信之LocalSocket通信
LocalSocket,在Unix域名空间创建的一个套接字(非服务端). 是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信. 具体就是Native层Server和Framew ...
- 从零开始学android -- 简易的socket通信
先来介绍下socket,网上摘抄点资料,免得自己打字了 网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互 ...
- android中非堵塞socket通信
1.什么是同步与异步,堵塞与非堵塞 首先我们要明确搞明确:同步就等于堵塞?异步就等于非堵塞?这是不正确的,同步不等于阻 塞.而异步也不等于非堵塞. 1)那什么是同步编程? 什么是同步,就是在发出一个功 ...
- android wifi热点 socket通信
1.首先建立wifi热点服务器 wifi客户端连接 2.开启一个子线程循环监听某个端口,进行数据流输入输出 /* 服务器 接收数据 */ class Receiver extends Thread ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- Android native进程间通信实例-socket本地通信篇之——基本通信功能
导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
随机推荐
- ECMall——安装时的小bug解决办法
第一次安装ECmall,安装了好多遍,总是出现Strict Standards: Non-static method这样的错误,折腾了五六遍,还是安装不上,仍然是类似的错误.气愤!于是上百度查:Ecm ...
- MyBatis 查询记录时日期字段没有时分秒
今天发现如果表里面的字段为Date类型时,程序查询出来的数据只有年月日 搜索了下,发现在resultMap里面把这个字段的jdbcType原先为Date,改为Timestamp就行了. 确实可以.
- AWIT DBackup 0.0.20 发布,备份系统
AWIT DBackup 0.0.20 修复了几个小 bug. AllWorldIT DBackup 是一个备份系统,为每个目录创建一个独立的压缩包,这更便于搜索. 特点: 使用 xz, bzip2, ...
- OSX 下搭建Asp.Net vNext的开发环境
开年第一天,按照惯例逛逛各个网站,看看7天有没有什么错过的东西,偶见VS 2015的CPT 6发布了,据说更新ASP.NET,就顺便去官方网站看了看,也忘记在什么地方偶然发现一个叫OmniSharp的 ...
- Hadoop开发第4期---分布式安装
一.复制虚拟机 由于Hadoop的集群安装需要多台机器,由于条件有限,我是用虚拟机通过克隆来模拟多台机器,克隆方式如下图所示
- DeviceOne 让你一见钟情的App快速开发平台
接触 DeviceOne 要从15年11月开始说起了,因项目和产品时间需求接触了快速开发平台,DeviceOne是非常棒的一个平台,双向数据绑定,可以自定义指令,过滤器等等.总之非常好用完全超出了我们 ...
- 团队项目——站立会议DAY12
第十二次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:已经将部分代码完成,对一些模块化的功能进行扩展,对已具备的功能进行完善. 2.钟灵毓秀:对代码进行了修改 ...
- 【吐血分享】SQL Server With As 递归获取层级关系数据
纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ...
- [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
利用周末时间将整个电脑格式化,换成了ubuntu系统- 所谓:扫清屋子再请客! 但是有些软件只在win上有,于是还是考虑装个虚拟机来个——逐步过度策略,一点点地从win上转移到linux上 我的系统是 ...
- 跨站脚本攻击XSS
跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到 ...