001/*
002 * $Id$
003 */
004
005//package edu.unima.ky.parallel;
006package edu.jas.util;
007
008
009import java.io.IOException;
010import java.io.ObjectOutputStream;
011import java.io.ObjectInputStream;
012import java.net.Socket;
013
014
015/**
016 * SocketChannel provides a communication channel for Java objects using TCP/IP
017 * sockets. Refactored for java.util.concurrent.
018 * @author Akitoshi Yoshida
019 * @author Heinz Kredel
020 */
021public class SocketChannel {
022
023
024    /*
025     * Input stream from the socket.
026     */
027    private final ObjectInputStream in;
028
029
030    /*
031     * Output stream to the socket.
032     */
033    private final ObjectOutputStream out;
034
035
036    /*
037     * Underlying socket.
038     */
039    private final Socket soc;
040
041
042    /**
043     * Constructs a socket channel on the given socket s.
044     * @param s A socket object.
045     */
046    public SocketChannel(Socket s) throws IOException {
047        soc = s;
048        out = new ObjectOutputStream(s.getOutputStream());
049        out.flush();
050        in = new ObjectInputStream(s.getInputStream());
051    }
052
053
054    /**
055     * Get the Socket
056     */
057    public Socket getSocket() {
058        return soc;
059    }
060
061
062    /**
063     * Sends an object
064     */
065    public void send(Object v) throws IOException {
066        synchronized (out) {
067            out.writeObject(v);
068            out.flush();
069        }
070    }
071
072
073    /**
074     * Receives an object
075     */
076    public Object receive() throws IOException, ClassNotFoundException {
077        Object v = null;
078        synchronized (in) {
079            v = in.readObject();
080        }
081        return v;
082    }
083
084
085    /**
086     * Closes the channel.
087     */
088    public void close() {
089        if (in != null) {
090            try {
091                in.close();
092            } catch (IOException e) {
093            }
094        }
095        if (out != null) {
096            try {
097                out.close();
098            } catch (IOException e) {
099            }
100        }
101        if (soc != null) {
102            try {
103                soc.close();
104            } catch (IOException e) {
105            }
106        }
107    }
108
109
110    /**
111     * to string
112     */
113    @Override
114    public String toString() {
115        return "socketChannel(" + soc + ")";
116    }
117
118}