
假设你的java项目要和一个php项目通信,你想传递变量过去,那么可采用如下式:
这样,将参数传递过去,在php端,建立一个方法,暴露给外部,即可以通过url访问到该方法即可。php方法return的值就是response的值。注意如果不指定charset,则默认字符集是iso-8859-1。如果php端要向java项目传递数据,那么php端要用到curl post数据过来,注意要设置header,主要指定字符集,否则中文乱码,java端要将iso-8859-1转成utf-8在java端,新建一个servlet即可,它的dopost方法,将接收php curl post过来的数据。在回写的时候,这样:
php端得到123456; 因为2个项目有共同的数据格式>
结构体(struct)类型比较合适,用链表来进行管理。如
struct communicationpeople{
str name[20]; //姓名
char sex;//性别
int age; //年龄
long int tel;//电话号码
};
Android App开发中的IPC(进程间通信)无处不在。比如我们使用的 AlarmManager 、 InputMethodService 都是系统为我们提供的服务,处于单独的进程中。如果需要在自己的App进程中使用这些服务就需要进行IPC通信。
除此之外,我们自己的程序中也会存在进程通信的可能(特别是在一些大型APP中)
QQ:未登陆
微信:使用一段时间后:
场景:在Service中开启定位服务,Service处于单独的进程,需要在App主进程或者其他APP中获得定位结果。
服务中提供暴露给其他进程使用的方法并提供一个 ServiceId 注解标记,而服务实现中必须给到相同的 ServiceId 与方法实现,不强制要求 LocationManager 一定需要继承 ILocationManager j接口,但是为了保证方法签名统一建议继承。(不然一个是getLocation,另一个是getLocation2就不好玩了)
在Service进行定位,定位结果在 LocationManager 中记录。在这个Service中使用框架注册 LocationManager 。
不需要返回 Binder 对象,这意味着使用者不需要编写繁琐没任何提示的AIDL文件。
框架内部会提供 comenjoyipcIPCService$IPCServiceX 多个预留Service,用于与其他进程通信,如果一个App存在多个进程都需要提供各自进程的服务,可以使用不同的Service。所以本质上依然是借助的Service+Binder通信,但框架将细节封装隐藏,使用更加简单。
获得结果对象后就能像调用本地方法一样调用远程方法(RPC调用)。
在使用中简化了:
1、不需要自己定义AIDL接口,使用的JavaBean也不要求实现 Parcelable 接口;
2、在客户端不需要直接使用 bindService 获得 Binder 对象;
服务端需要定义暴露服务的接口(ILocationManager),客户端如果是其他APP,则需要将接口类放到自己的源码中(不需要接口实现)。接口中定义的方法就是服务端提供给其他进程使用的方法。
整个框架包含了服务端与客户端两端接口。
在服务进程中会缓存 ServiceId 与对应的服务实现Class对象: 服务表 ,同时服务实现中的所有方法列表也需要进行记录: 方法表 。由于一个服务中可能存在多个方法,所以其数据结构为 Map<Class,Map<String,Method>> ,外层 Map 的key为服务Class,内层 Map 的key则为方法标记。
当客户端需要调用服务时,将 ServiceId 、MethodName以及执行方法需要的参数传递给服务端,服务端查表利用反射 Method#invoke 即可执行服务中的方法。
其中客户端的请求被封装为 Request 对象,服务端响应则封装为 Response 对象
服务端只需要暴露服务接口给其他进程使用,所以服务端只需要调用框架的注册接口 regiest 对服务实现进行注册。( 注册的是服务实现,而不是服务接口 )
注册时,通过反射获得Class上的 ServiceId 即可记录 服务表 。同时利用反射获得Class中所有的public Method即可记录 方法表 。
由于框架本质还是利用Binder来完成通信,为了与其他进程通信,框架内部提供了多个预留的Service。
通信Service会返回一个AIDL生成的Binder类对象
客户端使用 send 方法向服务端发起请求。
服务端接收到请求后的实现:
客户端需要先与服务端建立连接,因此框架中提供了 connect 方法,内部封装 bindService 实现与服务端通信Service( IPCService )的绑定。
唯一需要注意的是:
当完成绑定后,客户端就可以获得服务端通信Service提供的 IIPCService 对象,客户端调用 IIPCService#send 发起请求。
当我们需要获得 Location 。则应该调用 LocationManagergetDefault()getLocation() 。这句调用会需要执行 LocationManager 的两个方法: getDefault 与 getLocation 。
然而这个对象存在服务端,客户端如何获得?
我们可以利用动态代理,在客户端创建一个 "假的" 服务接口对象(代理)。
当我们执行这个代理对象的方法( getLocation )时,会回调 IPCInvocationHandler#invoke 方法,在这个方法中框架会向服务端发起请求: IIPCService#send
而 getLocation 会返回一个 Location 记录定位信息的对象,这个对象会被服务端json序列化发送过来,因此,客户端只需要在此处获得 Method 的返回类型并反序列化即可。
RPC指的是:从客户端上通过参数传递的方式调用服务器上的一个函数并得到返回的结果,隐藏底层的通讯细节。在使用形式上像调用本地函数一样去调用远程的函数。
比如我们使用Ok>
客户端
import javaioBufferedReader;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javaioOutputStream;
import javaioPrintWriter;
import javanetSocket;
import javanetUnknownHostException;
public class EchoClient {
private String host = "localhost";
private int port = 5000;
private Socket socket = null;
public EchoClient() throws UnknownHostException, IOException {
socket = new Socket(host, port);
}
public static void main(String g[]) throws UnknownHostException,
IOException {
new EchoClient()talk();
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socketgetOutputStream(); // 首先从socket对象中获得输出的空间,即输出流,
// 再传到PrintWriter类中。
return new PrintWriter(socketOut, true); // 创建PrintWriter类,参数一:输出流,
// 参数二:为boolean值,true表示每写一行,PrintWrinter缓存就自动溢出,把数据写到目的地
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socketgetInputStream();// 首先从socket对象中获得输入流,再传到InputStreamReader类中。
return new BufferedReader(new InputStreamReader(socketIn));// 创建BufferedReader类,参数为InputStreamReader的对象
}
public void talk() {
BufferedReader br;
try {
br = getReader(socket);
PrintWriter pw = getWriter(socket);
BufferedReader localReader = new BufferedReader(
new InputStreamReader(Systemin));//在控制台中输入
String msg = null;
while ((msg = localReaderreadLine()) != null) {
pwprintln("Client:"+msg);
Systemoutprintln(brreadLine());
if (msgequals("bye")) {
break;
}
}
} catch (IOException e) {
eprintStackTrace();
} finally {
try {
socketclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
------------------------------------------------------------------
服务端
import javaioBufferedReader;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javaioOutputStream;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
public class EchoServer {
private int port = 5000; // 端口
private ServerSocket serverSoket = null; // 创建一个服务器
public EchoServer() throws IOException {
serverSoket = new ServerSocket(port); // 实例化服务器,注意:记得输入端口号
Systemoutprintln("服务器启动");
}
public String echo(String msg) {
return "echo:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socketgetOutputStream(); // 首先从socket对象中获得输出的空间,即输出流,
// 再传到PrintWriter类中。
return new PrintWriter(socketOut, true); // 创建PrintWriter类,参数一:输出流,
// 参数二:为boolean值,true表示每写一行,PrintWrinter缓存就自动溢出,把数据写到目的地
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socketgetInputStream();// 首先从socket对象中获得输入流,再传到InputStreamReader类中。
return new BufferedReader(new InputStreamReader(socketIn));// 创建BufferedReader类,参数为InputStreamReader的对象
}
public void service() {
while (true) {
Socket socket = null; // 创建一个客户端
try {
Systemoutprintln("获得连接之前");
socket = serverSoketaccept(); // 等待客户连接,accept()将返回一个socket对象,即客户连接者。
Systemoutprintln("获得连接之后");
Systemoutprintln("New connection accepted"
+ socketgetInetAddress() + ":" + socketgetPort());
BufferedReader br = getReader(socket);// 创建BufferedReader的对象并实例化
PrintWriter pw = getWriter(socket); // 创建PrintWriter的对象并实例化
String msg = null;
while ((msg = brreadLine()) != null) {//brreadLine(),本次中只能读一次。
Systemoutprintln(msg);
if (msgequals("bye")) { //如果为bye那么就退出
break;
}
BufferedReader tempbr = new BufferedReader(
new InputStreamReader(Systemin));//在控制台中输出
String tempS = tempbrreadLine();
if (tempSequals("bye")) { //如果为bye那么就退出
break;
}
pwprintln("Server:"+tempS); // 将所要回复的信息写到socket对象输出流中。
}
} catch (IOException e) {
eprintStackTrace();
} finally {
if (socket != null) {
try {
socketclose();//关闭客户端
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
}
public static void main(String[] g) throws IOException {
new EchoServer()service();
}
}
以上就是关于网络体系结构与应用程序体系结构之间有什么区别全部的内容,包括:网络体系结构与应用程序体系结构之间有什么区别、程序员:.NET架构与模式、ISO的通信功能里的七个层次分别是什么意思啊划分原则又是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)