summaryrefslogtreecommitdiff
path: root/src/tesseract/objects/remote/RemoteObject.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/tesseract/objects/remote/RemoteObject.java')
-rw-r--r--src/tesseract/objects/remote/RemoteObject.java122
1 files changed, 116 insertions, 6 deletions
diff --git a/src/tesseract/objects/remote/RemoteObject.java b/src/tesseract/objects/remote/RemoteObject.java
index e3edc1c..32f5a11 100644
--- a/src/tesseract/objects/remote/RemoteObject.java
+++ b/src/tesseract/objects/remote/RemoteObject.java
@@ -1,6 +1,14 @@
package tesseract.objects.remote;
import java.awt.event.KeyEvent;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.util.UUID;
import javax.vecmath.Vector3f;
@@ -22,16 +30,51 @@ public abstract class RemoteObject extends PhysicalObject {
*/
protected static final float STEP = 0.01f;
+ /**
+ * Unique object id.
+ */
+ private UUID myId;
+
+ /**
+ * The home address.
+ */
+ private SocketAddress myHome;
+
+ /**
+ * The local computer address.
+ */
+ transient private boolean isLocal;
+
+ /**
+ * The socket.
+ */
+ transient private RemoteObjectReciever myListener;
+
+ /**
+ *
+ * @param thePosition
+ * @param mass
+ */
public RemoteObject(Vector3f thePosition, float mass) {
super(thePosition, mass);
+
+ myId = UUID.randomUUID();
+ isLocal = true;
}
-
+
+ public void setHome(SocketAddress home) {
+ myHome = home;
+
+ myListener = new RemoteObjectReciever();
+ new Thread(myListener).start();
+ }
+
/**
* This method is called when a key event is received.
*
* @param event The KeyEvent recieved
*/
- protected void keyEventReceived(final KeyEvent event) {
+ protected void keyEventReceived(final KeyInfo event) {
switch (event.getKeyCode()) {
case KeyEvent.VK_W:
velocity.z -= STEP;
@@ -57,17 +100,84 @@ public abstract class RemoteObject extends PhysicalObject {
* @return The object's name for the menu.
*/
public abstract String getName();
+
+ public UUID getId() {
+ return myId;
+ }
/**
* Send a KeyEvent to this remote object.
*
* @param keyEvent The key event
*/
- public void sendKeyEvent(final KeyEvent keyEvent) {
- // TODO: Send this event over the network if necessary.
+ public void sendKeyEvent(final KeyInfo keyEvent) {
keyEventReceived(keyEvent);
-
updateTranformGroup();
}
-
+
+
+ private void readObject(ObjectInputStream in)
+ throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+
+ // Start Socket Thread
+ myListener = new RemoteObjectReciever();
+ new Thread(myListener).start();
+
+ }
+
+ private void writeObject(ObjectOutputStream out)
+ throws IOException {
+ out.defaultWriteObject();
+
+ myListener.stop();
+ }
+
+ private class RemoteObjectReciever implements Runnable {
+ private Socket mySocket;
+
+ public void stop() {
+ try {
+ mySocket.close();
+
+ } catch (IOException e) {
+ }
+ }
+
+ public void run() {
+ mySocket = new Socket();
+
+ try {
+ System.out.println("Connecting to " + myHome);
+ mySocket.connect(myHome);
+
+ // Send id
+ DataOutputStream out = new DataOutputStream(mySocket.getOutputStream());
+ out.writeLong(myId.getMostSignificantBits());
+ out.writeLong(myId.getLeastSignificantBits());
+ out.flush();
+
+ // Wait for data
+ DataInputStream in = new DataInputStream(mySocket.getInputStream());
+
+ while (true) {
+ try {
+ int key = in.readInt();
+
+ KeyInfo event = new KeyInfo(key);
+
+ sendKeyEvent(event);
+
+ } catch (Exception e) {
+ System.err.println("Could not read KeyEvent: " + e);
+ break;
+ }
+ }
+
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ }
}