001 //package edu.unima.ky.parallel; 002 003 import java.io.IOException; 004 import java.nio.channels.SocketChannel; 005 import java.nio.ByteBuffer; 006 007 /** 008 * ObjectBufferChannel. 009 * This class creates a communication channel using a socket. 010 * @author Heinz Kredel. 011 */ 012 013 public class ObjectBufferChannel implements ObjectChannel { 014 015 /** 016 * default capacity for ByteBuffer. 017 */ 018 final static int DEFAULT_CAPACITY = 4*1024; // 4k 019 020 /** 021 * heap ByteBuffer. 022 */ 023 final ByteBuffer hbb; 024 025 /** 026 * object ByteBuffer wraper. 027 */ 028 final ObjectBuffer ob; 029 030 /** 031 * socket channel. 032 */ 033 final SocketChannel soc; 034 035 036 /** 037 * Constructs a socket channel on the given socket s. 038 * @param s socket channel. 039 * @param cap capacity of ByteBuffer. 040 */ 041 public ObjectBufferChannel(SocketChannel s, int cap) 042 throws IOException { 043 soc = s; 044 hbb = ByteBuffer.allocate(cap); 045 // hbb.clear(); // or hbb.rewind() ? 046 ob = new ObjectBuffer( hbb ); 047 } 048 049 /** 050 * Constructs a socket channel on the given socket s. 051 * @param s socket channel. 052 */ 053 public ObjectBufferChannel(SocketChannel s) 054 throws IOException { 055 this(s,DEFAULT_CAPACITY); 056 } 057 058 /** 059 * Sends an object. 060 * @param v Object to send. 061 */ 062 public void send(Object v) throws IOException { 063 synchronized (hbb) { 064 hbb.clear(); 065 ob.put(v); 066 hbb.flip(); 067 soc.write( hbb ); 068 } 069 } 070 071 072 /** 073 * Receives an object. 074 * @return received Object. 075 */ 076 public Object receive() throws IOException, ClassNotFoundException { 077 Object v = null; 078 synchronized (hbb) { // use different buffer 079 hbb.clear(); // if remaining() == 0 080 soc.read( hbb ); 081 hbb.flip(); 082 v = ob.get(); 083 } 084 return v; 085 } 086 087 088 /** 089 * Closes the channel. 090 */ 091 public void close() { 092 if (soc != null) { 093 try { soc.close(); } catch (IOException e) { } 094 } 095 } 096 097 }