不同的即时通讯工具之间如何实现互联互通?
不能实现吧,我用过QQ、飞鸽传书、FreeEIM这些软件,都必须是相同即时通讯工具才能互通
MSN与QQ能实现互相通信吗?
按正常来说,是不可以的.但你一定要实现互相通讯的话,办法是有的.要办法的加我!
如何在程序之间进行通信
1、剪贴板CliPBoard:在16位时代常使用的方式,CWnd中提供支持
2、窗口消息标准的Windows消息以及专用的WM_COPYDATA消息SENDMESSAGE()接收端必须有一个窗口
3、使用共享内存方式(SharedMemory)
a.设定一块共享内存区域
HANDLECreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR)
产生一个file-mapping核心对象
LPVOIDMapViewOfFile(
HANDLEhFileMappingObject,
DWORDdwDesiredAcess,
DWORDdwFileOffsetHigh,
DWORDdwFileOffsetLow,
DWORDdwNumberOfBytesToMap
);
得到共享内存的指针
b.找出共享内存
决定这块内存要以点对点(peertopeer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己排在第一位,并接下来将共享内存初始化。
还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用
HANDLEOpenFileMapping(DWORDdwDesiredAccess,
BOOLbInheritHandle,
LPCTSTRlpName);
再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaningup)BOOLUnmapViewOfFile(LPCVOIDlpBaseAddress);
CloseHandle()
4、动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存了,现在的内存只有一种就是
即时通讯软件用户之间怎么建立p2p通讯
即时通讯软件用户之间建立p2p通讯方法:
1. p2p网络中的中继转发部分(transfer)
2. 系统的发送部分(sender)
3. 系统的接收部分(receiver)
(1)中继转发部分(transfer)
transfer主要负责提供匿名通信的服务,接收sender不同类型的消息,对其信息进行解密操作并且传递到jxta网络中下一个peer的transfer,如果是最终结点peer就首先建立与receiver的连接,然后将信息解密之后,再解析xml文件得到数据传递到receiver。然后再接收receiver不同类型的消息,对其信息进行加密操作并且传递到下一个peer的transfer ,直到传回到sender。在sender请求建立通道时,必须根据sender 请求信息判断这个transfer是作为中间结点处理数据还是作为最终结点处理数据,两者的处理信息方式有很大区别。如果信息传递过程中出现问题,将出错信息传回receiver。
(2)发送部分(sender)
sender主要负责查找jxta网络中提供匿名通信服务的transfer,通过找到的transfer建立起一条基于p2p网络的通道,然后就可以在这条通道上建立每一个socket通话连接,这样通过这条通道就可以传递不同类型的信息(请求建立通道、数据、请求结束通话、请求关闭通道、建立通道允许、结束通话允许、关闭通道允许以及出错信息)。在接收到receiver传递过来的信息时,由于经过加密得到的是密文,必须按照建立的p2p网络路径的顺序进行解密,才能得到所需要的明文数据。在传递信息时,把需要传递的信息封装成xml的格式,这样在需要使用这些信息的transfer上就可以解析出所需要的数据,以便于进行下一步的操作。
(3)接收部分(receiver)
receiver主要负责在接收到p2p网络中的transfer传递过来时的socket连接请求时同意socket连接,列出和自己建立连接的sender,通过选择sender进行基于p2p网络的信息传递。在接收到p2p网络中的transfer传递过来时的socket通话结束请求时关闭socket连接,同时取消在列表中的sender,这样receiver就无法与结束通话的sender再次取得联系。在receiver关闭时,必须通知所有已经与自己连接的sender,sender才可以关闭与这个receiver的连接。
微信和哪个手机软件可以互相通信来往?
微信只能和微信通信,其他的不行.
怎么用C语言实现聊天工具中,两个客户端之间的通信呢?
UDP连接,分别建立socket,发送到对方电脑的特定端口上.
(最好的)能使各IM(即时通讯)软件之间实现跨平台互联互通的即时通讯软件是什么?
是的,ello是个很好的即时通讯软件,能有效连接QQ,飞信,很不错,这样我的朋友不管是用飞信还是QQ,我都能及时与他们联系!
局域网内两台机器的两个程序是怎样实现互相通信的
用c#或c++,编写基于socket的网络程序,分为客户端和服务器端,具体可查阅一网络编程方面的书.
允许在两台远程计算机上的两个应用程序互相通信的体系结构 是哪两个体系结构
OSI分层结构体系中最重要的最基础的一层,它 是建立在通信介质基础上的,允许不同计算机上的两个应用程序建立、使用和结 束会话连接…
android 如何让两个apk相互通信
A.apk,B.apk都是我写的.现在我想在B.apk里实现获得A.apk的某控件ID,并向其发送一个按键事件.如何实现,谢谢!也就是用B控制A.
这两个apk 是在两个进程里的,(或许可以配置成一个进程。不过如何直接操作这个没有试过。)
所以一般的有两种方法:
1、RPC
2、通过 BroadcastRecever 或 Service
第二种方法比较简单一些。
比如B 控制 A的话,
A定义Service ,比如com.my.ServerA .自定义actionFilter “com.my.serverA.action”
B中调用Intent it = newIntent(“com.my.serverA.action”);
it.putExtra(….);// 传递你的自定义控制指令。
B.startService(it);
在A中ServerA的 onStartService(Intent it) 。解析这个控制指令,做相应操作就可以了。
用BroadcastRecever 的道理一样。
Aidl,android平台的IPC方式之一,基于系统的Ibinder机制。
网上大多数例子都是在一个apk下来测试调用service,现在我在两个project下面来调用。
一个是server project,一个是client project
首先我们建立的是server project,这里面要实现aidl文件和一个service,activity只是用来启动service的,当然,你也可以通过发广播的形式来启动service。
首先看IAidlService.aidl文件:
Java代码
package com.ds.server;
interface IAidlService {
int getType();
}
这样在eclipse里面自动编译的时候会在gen下面生成IAidlService.java文件(灯下我们的client project要用)。
然后新建一个service,这个service里面has a IAidlService的stub对象,service具体代码如下:
Java代码
package com.ds.server;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class AidlService extends Service {
private IAidlService.Stub mBinder = new IAidlService.Stub() {
@Override
public int getType() throws RemoteException {
// TODO Auto-generated method stub
return 5;
}
};
private void Log(String str) {
Log.d(“AidlService”, “—— ” + str + “——“);
}
@Override
public void onCreate() {
Log(“service create”);
}
@Override
public void onStart(Intent intent, int startId) {
Log(“service start id=” + startId);
}
@Override
public IBinder onBind(Intent t) {
Log(“service on bind”);
return mBinder;
}
@Override
public void onDestroy() {
Log(“service on destroy”);
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log(“service on unbind”);
return super.onUnbind(intent);
}
public void onRebind(Intent intent) {
Log(“service on rebind”);
super.onRebind(intent);
}
}
这里一定要实现onBind方法,并返回一个IAidlService.Stub对象。
再去AndroidManifest.xml注册这个service:
Xml代码
android:name=”.AidlService” android:enabled=”true” android:process=”:remote” >
android:enabled=”true”
android:process=”:remote”这两个标签可有可无。
只要注册了这个service就行。
好了,到此,服务端已经完成。
——————-华丽的分割线—————————————–
下面我们开始client project。
client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。
(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。)。
好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:
Java代码
package com.ds.client;
import com.ds.server.IAidlService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AidlClientActivity extends Activity {
IAidlService iservice;
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
// 从远程service中获得AIDL实例化对象
iservice = IAidlService.Stub.asInterface(service);
Log.i(“Client”,”Bind Success:” + iservice);
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
iservice = null;
Log.i(“Client”,”onServiceDisconnected”);
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv = (TextView) findViewById(R.id.tv);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);
if (iservice != null) {
try {
tv.setText(“” + iservice.getType());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
}
注意几点:
1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类
2,需要一个ServiceConnection对象
3,通过Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。
唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。
附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。