Hey everyone, so I’ve tried to program a two-player version of Tetris. Essentially, the server runs the game, the client sends move/rotate commands, and then the server sends back the board and piece data.
I’m using ObjectInputStreams and ObjectOutputStreams in TCP/IP. I’d do something like this:
Socket client;
ServerSocket ss;
ObjectOutputStream oos;
ObjectInputStream ois;
Transmitter transmitter;
Receiver receiver;
client = ss.accept();
oos = new ObjectOutputStream(client.getOutputStream());
ois = new ObjectInputStream(client.getInputStream());
transmitter = new Transmitter(oos);
receiver = new Receiver(ois);
Transmitter Class:
package tetris.net;
import java.io.*;
import java.net.*;
import java.util.*;
public class Transmitter implements Runnable
{
ObjectOutputStream oos;
Vector<Object> vec;
public boolean running;
Thread th;
public Transmitter (ObjectOutputStream oos)
{
this.oos = oos;
vec = new Vector<Object>(50,10);
running = true;
th = new Thread(this);
th.start();
}
public void run ()
{
while (running)
{
while (!vec.isEmpty())
{
Object object = vec.get(0);
writeOut(object);
vec.remove(0);
}
try
{
th.sleep(15);
}
catch (InterruptedException ie) {}
}
}
private void writeOut (Object object)
{
try
{
oos.writeObject(object);
oos.reset();
}
catch (Exception e)
{
System.out.println("Error on transmitter");
running = false;
}
}
public void add (Object object)
{
vec.add(object);
}
public int getSize ()
{
return vec.size();
}
}
Receiver Class:
package tetris.net;
import java.io.*;
import java.net.*;
import java.util.*;
public class Receiver implements Runnable
{
ObjectInputStream ois;
Vector<Object> vec;
public boolean running;
Thread th;
public Receiver (ObjectInputStream ois)
{
this.ois = ois;
vec = new Vector<Object>(50,10);
running = true;
th = new Thread(this);
th.start();
}
public void run ()
{
while (running)
{
readIn();
}
}
private void readIn ()
{
Object object;
try
{
object = ois.readObject();
}
catch (Exception e)
{
System.out.println("Error on receiver");
running = false;
return;
}
vec.add(object);
}
public int getSize ()
{
return vec.size();
}
public Object extract ()
{
if (vec.size() == 0)
return null;
Object object = vec.get(0);
vec.remove(0);
return object;
}
}
Essentially, if the client were to tell the server to move its piece one unit to the left, it would add a serialized integer to the transmitter.
Now, am I correct in assuming that using ObjectStreams won’t bring about decent network play? Is there something that I’m doing wrong here?
Thanks!