//package fixmico;
import java.io.*;
import java.lang.*;
import java.util.*;
import java.net.*;
/**
* <p>Title: TCPTransport.java </p>
* <p>Description: </p>
*
* @author: Jessica Rogers
*/
public class TCPTransport extends Transport
{
private TCPAddress _addr;
private Socket _socket;
private ServerSocket _serverSocket;
public TCPTransport (TCPAddress addr)
{
_addr = addr;
_socket = null;
_serverSocket = null;
}
public boolean accept()
{
try {
_serverSocket = new ServerSocket(_addr.port());
} catch (BindException e)
{
System.out.println("Port "+ _addr.port()+ " seems to be in use: Can't bind");
System.exit(1);
} catch(SocketException e)
{
System.out.println("Socket Exception Error ");
System.exit(1);
} catch (IOException e)
{
System.out.println("I/O Exception at port "+ _addr.port());
System.exit(1);
}
try {
_socket = _serverSocket.accept();
} catch (IOException e)
{
System.out.println("I/O Exception at port "+ _addr.port());
System.exit(1);
}
_isClosed = false;
return true;
}
public boolean open()
{
boolean state = false;
try {
_socket = new Socket(_addr.host(), _addr.port());
state = true;
} catch (UnknownHostException e)
{
System.err.println("Don't know about host "+ _addr.host());
} catch(ConnectException e)
{
System.err.println("Failure in obtaining connection with server ");
} catch (IOException e)
{
System.err.println("Couldn't get I/O for host "+ _addr.host());
}
_isClosed = _socket.isClosed();
return state;
}
public int send(String message)
{
OutputStream os;
BufferedWriter wr;
int fSize = message.length();
echo("bytes to send: "+fSize);
if (_isClosed) {
echo("Transporte fechado!!");
}else{
echo("Transporte aberto!!");
}
try {
/*
if (_socket.isConnected()) {
echo("socket UP");
}else{
echo("socket DOWN");
}
if (_socket.isBound()) {
echo("socket isBound");
}else{
echo("socket notBound");
}
*/
os = _socket.getOutputStream();
wr = new BufferedWriter(new OutputStreamWriter(os));
wr.write(message);
wr.flush();
echo("message sent:");
echo("----------------------");
echo(message+"\n----------------------------");
} catch (IOException e) {
echo("IOException on socket listen: " + e);
e.printStackTrace();
}
return 0;
}
public int recv(StringBuffer messageBuffer, int size) {
InputStream is=null;
int num=0;
int avaiable = 0;
int left = size;
byte[] buff= new byte[size];
assert (_isClosed == false): "Transport is closed" ;
try {
is = _socket.getInputStream();
while ( left >0 ) {
avaiable = is.available();
num = is.read(buff);
if ( num == -1)
{
is.close();
return -1;
}
if (num == 0)
break;
for (int i = 0; i < num; i++) {
messageBuffer.append(buff[i]);
}
echo("received:\n"+messageBuffer.toString());
left -= num;
}
} catch (IOException e) {
e.printStackTrace();
echo("erro no recv ");
return -1;
}
return left;
}
public void close()
{
try {
if (_isClosed == false)
_isClosed = true;
_socket.close();
_serverSocket.close();
echo("conexao "+_addr.host()+":"+_addr.port()+" encerrada");
} catch (IOException e)
{
System.err.println("I/O Exception ");
}
}
public void closeSocket() {
try {
if (_isClosed == false) _isClosed = true;
_socket.close();
echo("conexao "+_addr.host()+":"+_addr.port()+" encerrada");
}catch(Exception e){}
}
public StringBuffer recv() {
int message_size = 0;
InputStream is = null;
BufferedReader rd = null;
int avaiable = 0;
StringBuffer buffer = new StringBuffer();
if (_isClosed) {
echo("Transporte fechado!!");
}else{
echo("Transporte aberto!!");
}
try {
is = _socket.getInputStream();
avaiable = is.available();
rd = new BufferedReader(new InputStreamReader(is));
int letra;
char c;
while ((letra = rd.read()) != 10) { //10 e o \n
if (letra == -1) break;
c = (char)letra;
buffer.append(c);
//System.out.println("[TCPTransport] lido: "+(char)letra +" -> "+letra);
}
try{
message_size = Integer.valueOf(buffer.toString());
}catch (Exception e) {
message_size = 0;
}
echo("message size: "+message_size);
buffer.delete(0, buffer.length());
//leio o tamanho da mensagem obtido
int size_count = 0;
while (size_count < message_size) {
size_count = size_count + 1;
letra = rd.read();
c = (char)letra;
buffer.append(c);
}
echo("message read:");
echo("----------------------");
echo("\n"+buffer.toString());
echo("----------------------");
} catch (IOException e) {
e.printStackTrace();
echo("Erro no recv: "+e.getMessage());
return null;
}
return buffer;
}
public boolean isConnected(){
return _socket.isConnected();
}
public boolean isBound(){
return _socket.isBound();
}
private void echo(String msg) {
ORB.log(msg);
//System.out.println(new Date()+" [TCPTransport] "+msg);
}
}