URGENT Sending data over tcp

Im trying to get my tracking code to work i can send a pwm value over tcp to robot with roborealm but it updates so slow even know on roborealm it is sending it at 50ms on the robot it takes about 500ms to register, here is the code, Roborealm sends it as an int, we have a competition tomorrow so ASAP would be great PLEASE AND THANKYOU


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Gus.Team228.Final;

import edu.wpi.first.wpilibj.Timer;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;

/**
 *
 * @author Matt Smith
 */
public class Socket extends Thread {

    private ServerSocketConnection socket;
    private SocketConnection connection;
    DataInputStream instream;
    DataOutputStream outstream;
    int datain;

    public void run() {

        try {
            socket = (ServerSocketConnection) Connector.open("socket://:1234");

            connection = (SocketConnection) socket.acceptAndOpen();

            instream = connection.openDataInputStream();

            outstream = connection.openDataOutputStream();
            
            while (true) {
                datain = instream.read();

                instream.read();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

//Teleop code:
motor.setRaw(socket.datain);

Here are some things to check out:

  1. Is RoboRealm flushing output at every int, or is getting buffered?

  2. Why is “instream.read()” called 2x in your loop?

  3. The field “Socket.datain” is being used to communicate between threads. For correct portable code this should be declared “volatile”, or all reads and writes should be guarded by synchronized statements. This shouldn’t actually matter for Java on the cRIO though.

  4. There isn’t any built-in Java-level input buffering on a Socket’s input stream in this version of Java. That shouldn’t result in a 10x slowdown though.

To test this you could try reading into a 4-byte array, and constructing an int from that

byte b] = new byte[4];

while (true) {
    int len = instream.read(b, 0, b.length); // should check that len is 4, and buffer up until full, but in practice you should see 4 bytes...

    datain = (b[0] << 24) | ((b[1] & 0xFF) << 16) |((b[2] & 0xFF) << 8) | (b[1] & 0xFF);  // or reverse the byte order if necessary.
}

I will try this thanks, also is UDP a better choice for speed?
Sorry but i dont understand what int len is for?

P.S, Yea i just noticed that there is 2 instream.read();

len is the number of bytes read by that specific call. Since there isn’t always enough new data available to fill your buffer, read() lets you know exactly how much was there (or, more correctly, how much it copied into your buffer).

UDP is faster, but it’s also a good bit riskier. TCP is nice because it guarantees that packets will arrive, that packets will not be corrupted, and that packets will arrive in the order they were sent. UDP guarantees nothing. However, since UDP doesn’t have all those checks, it will be faster. Be careful using it, though, because you can no longer rely on any of the guarantees of TCP.

Is UDP supported? i dont think it is in this version of java