java如何實現程序間的通訊?
先看看傳統的程序間通訊的手段:
(1) 管道(PIPE)
(2) 命名管道(FIFO)
(3) 訊號燈(Semphore)
(4) 訊息佇列(MessageQueue)
(5) 共享記憶體(SharedMemory)
(6) Socket(當然也有Socket)
如果加上上面提到的臨時檔案(臨時檔案其實是很難處理的,不同的程序間單靠臨時檔案可以互動資訊,但是做到程序的排程控制確是很費力的事情,當然也不是不能做到)
把JAVA程序理解為JVM程序。很明顯,傳統的這些大部分技術是無法被俺們的應用程式利用了(這些程序間通訊都是靠系統呼叫來實現的)。但是JAVA也有很多方法可以進行程序間通訊的。
除了上面提到的Socket之外,當然首選的IPC可以使用RMI,或者CORBA也可以。
其實JAVA的CORBA實現也是通過RMI來實現的,而RMI歸根結底也是靠Socket來實現的。
所以說JAVA程序間通訊的最基本手段是Socket也不為過。
package sharedmemory;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Consumer extends Thread
{
private String mFileName;
private FileChannel mFileChannel;
private MappedByteBuffer mMappedByteBuffer;
public Consumer(String fn)
{
try
{
mFileName=fn;
// 獲得一個可讀寫的隨機存取檔案物件
RandomAccessFile RAFile=new RandomAccessFile(mFileName,"r");
// 獲得相應的檔案通道
mFileChannel=RAFile.getChannel();
// 取得檔案的實際大小,以便映像到共享記憶體
int size=(int)mFileChannel.size();
// 獲得共享記憶體緩衝區,該共享記憶體可讀
mMappedByteBuffer=mFileChannel.map(FileChannel.MapMode.READ_ONLY,0,size).load();
}
catch(IOException ex)
{
System.out.println(ex);
}
}
public void run()
{
while(true)
{
try
{
Thread.sleep(300);
FileLock lock=null;
lock=mFileChannel.tryLock(0,10,true);
if(lock==null)
{
System.err.println("Consumer: lock failed");
continue;
}
Thread.sleep(200);
System.out.println("Consumer: "+mMappedByteBuffer.getInt(0)+":"+mMappedByteBuffer.getInt(4)+":"+mMappedByteBuffer.getInt(8));
lock.release();
}
catch(IOException ex)
{
System.out.print(ex);
}
catch(InterruptedException ex)
{
System.out.print(ex);
}
}
}
public static void main(String args[])
{
Consumer consumer=new Consumer("sharedMemory.bin");
consumer.start();
}
}
package sharedmemory;
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class Producer extends Thread
{
private String mFileName;
private FileChannel mFileChannel;
private MappedByteBuffer mMappedByteBuffer;
public Producer(String fn)
{
try
{
mFileName=fn;
// 獲得一個可讀寫的隨機存取檔案物件
RandomAccessFile RAFile=new RandomAccessFile(mFileName,"rw");
// 獲得相應的檔案通道
mFileChannel=RAFile.getChannel();
// 取得檔案的實際大小,以便映像到共享記憶體
int size=(int)mFileChannel.size();
// 獲得共享記憶體緩衝區,該共享記憶體可讀
mMappedByteBuffer=mFileChannel.map(FileChannel.MapMode.READ_WRITE,0,size).load();
}
catch(IOException ex)
{
System.out.println(ex);
}
}
public void run()
{
int i=0;
while(true)
{
try
{
FileLock lock=null;
lock=mFileChannel.tryLock();
if(lock==null)
{
System.err.println("Producer: lock failed");
continue;
}
mMappedByteBuffer.putInt(0,++i);
mMappedByteBuffer.putInt(4,++i);
mMappedByteBuffer.putInt(8,++i);
System.out.println("Producer: "+(i-3)+":"+(i-2)+":"+(i-1));
Thread.sleep(200);
lock.release();
Thread.sleep(500);
}
catch(IOException ex)
{
System.out.print(ex);
}
catch(InterruptedException ex)
{
System.out.print(ex);
}
}
}
public static void main(String args[])
{
Producer producer=new Producer("sharedMemory.bin");
producer.start();
}
}
相關推薦
Java使用管道實現程序間通訊
1.程序通訊 大家都知道程序間通訊有三種常用方式: 1)管道 2)共享記憶體 3)socket baidu也有說8種方式的,其實基本都是這三種方式的進一步細化。 2.Java程序通訊 Java沒有共享記憶體機制,同時Java的管道也只能用於Java執行緒間的通訊。 下
java:程序間通訊的方式
程序間通訊的方式有哪些,各有什麼優缺點: 1)管道:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序之間使用。程序的親緣關係通常是指父子程序關係。 2)有名管道(FIFO):有名管道也是半雙工的通訊方式,但是允許在沒有親緣關係的程序之間使用,管道是先進先出的通訊方式
iOS--CFMessagePort實現程序間通訊
CFMessagePort屬於CoreFoundation框架中的類。因此可以在http://opensource.apple.com/tarballs/CF/CF-855.17.tar.gz中在原始碼,如果感興趣可以去看看。 下面說下CFMessagePortRef的具體使用。 首先建立一
Android BroadcastReceiver使用,可實現程序間通訊
1、建立廣播接收器: /** * 作者:created by meixi * 郵箱:[email protected] * 日期:2018/11/1 09 */ public class MyBroadcastReceiver extends BroadcastReceiver
C#使用SendMessage實現程序間通訊的方法
本文例項講述了C#使用SendMessage實現程序間通訊的方法。分享給大家供大家參考。具體分析如下: 為了深入理解訊息機制,先來做一個測試專案 在新建專案的Form1的程式碼中,加入方法: ?
Android AIDL實現程序間通訊
今天犯二了, 犯了個超級低階的錯誤, 真的是丟人丟大發了. 剛好順道反思下, 也對工作這幾年做一些簡單的總結. 不知道你們是不是和我一樣也總遇到各
Linux 通過共享記憶體機制實現程序間通訊
問題背景 編寫程式 sender ,它建立一個共享記憶體,然後等待使用者通過終端輸入一串字元,並將這串字元通過共享記憶體傳送給 receiver;最後,它等待 receiver 的應答,收到應答訊息後,將接收到的應答資訊顯示在終端螢幕上,刪除共享記憶體,結束程式的執行。 編寫 receiver 程
linux 用命名管道實現程序間通訊
什麼是命名管道 命名管道和匿名管道一樣適用於程序之間的通訊linux匿名管道詳解,但是使用範圍不同,匿名管道要求必須是親緣程序,而命名管道卻沒有這個限制,它可以用於同一臺機器主機上的任意程序間通訊。
android Aidl 實現程序間通訊
1,android 新建aidl 檔案 刪除void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);這個方法沒用到 還需要實
第18天Service-Messager實現程序間通訊
第18天Service-Messager實現程序間通訊 Messager 一.Messager介紹 二.Messager的原理 特點: 三 .使用步驟 服務端moudle:messager
Android Studio使用AIDL 實現程序間通訊例項
參考:部落格:http://www.cnblogs.com/BeyondAnyTime/p/3204119.html, http://www.cnblogs.com/linlf03/p/3192025.html 視訊教程:http://www.imooc.com/l
Windows or Linux環境下利用“共享記憶體”實現程序間通訊的C/C++程式碼
程序A對應的程式: #include <iostream> #include <windows.h> using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappi
Python 實現程序間通訊(網路程式設計)
【網路程式設計】 1):網路程式設計是什麼意思,網路程式設計指的是不同機器之間通過網編相互發資訊,我們常用的“QQ”,“微信”,“郵箱” 都個網編程式設計的應用; 網編程式設計在技術上還有另一個叫法叫“程序間通訊”,程序間通訊這個名字能更好體現技術的內涵,說白了就是一個程序給另一個程序發 資訊;
java中程序間通訊,基於檔案和共享記憶體
附上編譯執行的原始碼: 1,請分別建立兩個工程來進行讀寫操作; 2,請在相應的目錄建立一個檔案例如:/home/tory/workspace/sharedMemory.txt 3,往檔案中輸入超過12個位元組資料:echo asldkjasldkddas > /hom
訊號量與共享記憶體實現程序間通訊(生產者消費者問題為例)
(一)訊號量訊號量是IPC的一種,可以看做是一個計數器,計數值為可用的共享資源的數量,訊號量可用於多程序的同步,為多個程序提供對共享資源的訪問。linux下的訊號量的介面函式如下:/*(1)獲取訊號量*/int semget(key_t key, int semnum, in
Linux訊息佇列實現程序間通訊
什麼是訊息佇列: 訊息佇列提供了從一個程序向另一個程序傳送一個有型別資料塊的方法。用這種方法可以避免命名管道的同步和阻塞問題。訊息佇列是基於訊息的,而管道是基於位元組流的,並且訊息佇列的讀取不一定是先入先出。 訊息佇列的操作: 訊息佇列的建立或者獲取: int msgg
Windows核心程式設計之郵槽實現程序間通訊
郵槽是Windows系統提供的一種單向通訊的機制。即程序中的一方只能寫入或讀取資料,而另一方則只能讀取或寫入資料。通過郵槽,使用者可以實現一對多或跨網路的程序之間的通訊。但是,郵槽能傳輸的資料
Android中Binder機制實現程序間通訊
基本上不管是何種開發都會涉及到程序間通訊的問題,即IPC,而安卓系統的IPC方式主要是Binder,先列舉幾種IPC的方式,對比Binder看看。 Linux裡
使用IPC實現程序間通訊(服務端使用Windows服務實現)
Net下看通過NetRemoting方便的實現程序間通訊,下面就具體總結一下:1、先定義通訊的介面,並封裝成庫: 注意,如果通訊時涉及到自定義的型別,一定要新增[Serializable]屬性,使類可序列化。 [Serializable] public class IPCI
Qt提供通過訪問共享記憶體實現程序間通訊
② 通過建構函式QSharedMemory::QSharedMemory (QObject * parent = 0 )構造例項物件,之後呼叫setKey()函式為該例項物件設定關鍵字。例如:QSharedMemory* sharememory;sharememory = new QSharedMemory(