blob: e66ee5f804c81b6fb275107cc357806962793834 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdi.internal.connect;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Arrays;
public class SocketTransportImpl extends TransportImpl {
public static final int MIN_PORTNR = 0;
public static final int MAX_PORTNR = 65535;
/** Handshake bytes used just after connecting VM. */
private static final byte[] handshakeBytes = "JDWP-Handshake".getBytes(); //$NON-NLS-1$
/** Socket on which VM is connected. */
private Socket fSocket = null;
/** ServerSocket used to listen to connecting VMs. */
private ServerSocket fServerSocket = null;
/**
* Constructs new SocketTransportImpl.
*/
public SocketTransportImpl() {
super("dt_socket"); //$NON-NLS-1$
}
/**
* Establishes a client connection to a virtual machine.
*/
public void attach(String hostname, int port) throws IOException {
fSocket = new Socket(hostname, port);
PerformHandshake();
}
/**
* Listens for connections initiated by target VMs.
*/
public void listen(int port) throws IOException {
closeListen();
fServerSocket = new ServerSocket(port);
}
/**
* @return Returns port number that is listened to.
*/
public int listeningPort() {
if (fServerSocket != null) {
return fServerSocket.getLocalPort();
}
return 0;
}
/**
* Closes socket connection.
*/
public void closeListen() throws IOException {
if (fServerSocket == null)
return;
fServerSocket.close();
fServerSocket = null;
}
/**
* Accepts connections initiated by target VMs.
*/
public void accept() throws IOException {
if (fServerSocket == null) {
return;
}
fSocket =fServerSocket.accept();
PerformHandshake();
}
/**
* Sets timeout on accept.
*/
public void setAcceptTimeout(int timeout) throws SocketException {
if (fServerSocket == null) {
return;
}
fServerSocket.setSoTimeout(timeout);
}
/**
* @return Returns true if we have an open connection.
*/
public boolean isOpen() {
return fSocket != null;
}
/**
* Closes socket connection.
*/
public void close() {
if (fSocket == null)
return;
try {
fSocket.close();
} catch (IOException e) {
} finally {
fSocket = null;
}
}
/**
* @return Returns InputStream from Virtual Machine.
*/
public InputStream getInputStream() throws IOException {
return fSocket.getInputStream();
}
/**
* @return Returns OutputStream to Virtual Machine.
*/
public OutputStream getOutputStream() throws IOException {
return fSocket.getOutputStream();
}
/**
* Performs handshake protocol.
*/
private void PerformHandshake() throws IOException {
DataOutputStream out = new DataOutputStream(fSocket.getOutputStream());
out.write(handshakeBytes);
try {
DataInputStream in = new DataInputStream(fSocket.getInputStream());
byte[] handshakeInput = new byte[handshakeBytes.length];
in.readFully(handshakeInput);
if (!Arrays.equals(handshakeInput,handshakeBytes))
throw new IOException(ConnectMessages.getString("SocketTransportImpl.Incorrect_handshake_reply_received___1") + new String(handshakeInput)); //$NON-NLS-1$
} catch (EOFException e) {
throw new IOException(ConnectMessages.getString("SocketTransportImpl.EOF_encoutered_during_handshake_2")); //$NON-NLS-1$
}
}
}