Log in

View Full Version : Problem with socket servers


TheTurtleofDoom
27-02-2014, 16:26
Hello, I am using roborealm to try and target the hotzone during autonomous, my sendsocket method or init mehtod is not working, I can not send the commands to the test socket server.

Driver-Station code

import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
import java.net.*;
import java.io.*;

/**
*
* @author rc10545
*/
public class Autonamous2014 {

int[] Cog_X = new int[9999];
//Creates the Cog_X array
int cogi = 0;
// controls Cog_X array
Boolean shoot, moveRight, moveLeft, terminate;
//controls what is passed to crio, and terminates the autonamus
PrintWriter out;

//Creates a variable that makess it easy to pass to Cro
public static void main(String args[]) throws IOException {

(new Autonamous2014()).runner();
// creates a runner object so that we can have cross method variables easily
}// method main

public void runner() throws IOException {
int Cogx;
// creates a variable that will become a simplified version of the int array"Cog_X"
shoot = false;
moveRight = false;
moveLeft = false;
terminate = false;
// sets the conrol booleans to false
init();
// makes the connection to the crio, not in loop/sendsocket so there is only one connection attempt per ruin of the program
while (terminate == false) {
cog();
//converts the text file into the int array "Cog_X"
Cogx = Cog_X[cogi];
// simplifies the int array "Cog_X" to a single int varaible "Cogx"
positioner(Cogx);
// the logic, determines what the robot should do based off of its int variable "Cogx" position in pixels, -----WILL NEED UPDDATING TO WORK PROPERLY WITH THE GOOD CAMERA!!!!-----
sendSocket();
//passes the commands to the Crio
}// while loop

}//method runner

public void init() {
byte[] ipAddr = new byte[]{10, 100, 72, 42};
//the Ip address array of the Crio
try {
InetAddress addr = InetAddress.getByAddress(ipAddr);
//converts the Ip address array into a usable IP adress
Socket socket = new Socket(addr, 55000);
//Tells it what socket to connect to on the Crio
socket.setSoLinger(false, 0);
//Tells it not to try to connect after the program has beeen closed down
out = new PrintWriter(socket.getOutputStream(), true);
//makes it so you can use the out.write("INSERT TEXT HERE"); command to pass info to the Crio
}/**
* try *
*/
catch (IOException e) {
System.out.println("Run the tcp server/Crio!");
//if someone is using this wrong, tells them what they need to do in relatively simple language
}//catch

}// method init

public void cog() throws IOException {

FileReader fr = new FileReader("c:/cygwin64/home/rc10545/variables");
// makes it so that the program can convert hte variable file into a char array; ---CHANGE IT WHEN THIS PROGRAM IS PUT ONTO THE DRIVERES STATION TO THE UPDATED FILE LOCATION!!!---
char[] a = new char[9999999];
//the char array that the file is read to
int i;
// contols the string array "tokens"
fr.read(a);
//updates/reads the text to char array "a"
String y = new String(a);
//turns the char array "a" into string "y"
String tokens[] = y.split("\r\n");
//splits the string vARIABLE "Y" down on every line break into string array "tokens"
i = tokens.length;
//Gets a variable for how long the string array "tokens" is

Integer convert = Integer.valueOf(tokens[i - 3]);
// converts the latest item in string array "tokens" into the int variable "convert"

Cog_X[cogi] = convert;
// puts the int variable "convert" into int array "Cog_X" for bugfixing purposes, int array "Cog_X" could be replaced by int variable "convert" with no problems

}//method cog

public void positioner(int Cogx) {

int remember = 0;
//remembers wether it has done the initial movement

if (remember == 0 && Cogx > 320) {
moveRight = true;
// sets the boolean variable "moveRight" to true, so in the sendSocket method it passess "goRight" to the crio
remember++;
// tells it that it has done the initial movement
} else if (remember == 0) {
moveLeft = true;
// sets the boolean variable "moveLeft" to true, so in the sendSocket method it passess "goLeft" to the crio
remember++;
// tells it that it has done the initial movement
}//does initial movement to bit right of the center of hotzone

if (remember == 2 && Cogx > 300 && Cogx < 330) {
shoot = true;
//tells it to shoot
} else if (remember == 1) {
remember++;
//makes sure it does not shoot while moving
}//shooter

cogi++;
//says that the latest index of int array "Cog_X" has been used
}//method positioner

public void sendSocket() throws IOException {

out.write("cookie");
//testing
out.flush();
// prevents ther from being a giant amount of text int the buffer by force sending it to the Crio
if (moveRight = true) {
out.write("goRight");
//tells the Crio to go right
} else if (moveLeft == true) {
out.write("goLeft");
// tells the Crio to shoot
} else if (shoot == true) {
out.write("fire");
// tells the Crio to shoot
//terminate = true;
// terminates the porgram, ---DISABLED FOR TESTING---
}

}//socket writer

}//class; and nope not 150 lines of code ~75 lines of commenting


Server(slightly modified) code
package tcp_server;

import java.io.*;
import java.net.*;
import java.security.*;

/**
*
* Title: Sample Server Description: This utility will accept input from a
* socket, posting back to the socket before closing the link. It is intended as
* a template for coders to base servers on. Please report bugs to brad at
* kieser.net Copyright: Copyright (c) 2002 Company: Kieser.net
*
* @author B. Kieser
* @version 1.0
*
* Comprehensive style changes made by shall 12/20/12
*/
/*page --------------------------------------------------------------------- */
public class Tcp_server {

private static int port = 55000;
private static int maxConnections = 10;


/* --------------------------------------------------------------------- */
/* LISTEN FOR INCOMING CONNECTIONS AND HANDLE THEM */
/* --------------------------------------------------------------------- */
public static void main(String[] args) {

int i = 0;

try {

ServerSocket listener = new ServerSocket(port);
Socket server;

while ((i++ < maxConnections) || (maxConnections == 0)) {
doComms connection;

server = listener.accept();
server.setSoLinger(false, 0);
doComms conn_c = new doComms(server);
System.out.println("GOT CONNECTION, CONNECTION COUNT [ " + i + " ]");
Thread t = new Thread(conn_c);
System.out.println("STARTING PROCESSING THREAD");
t.start();

} /* while((i++ < maxConnections) || (maxConnections == 0)) */

} catch (IOException ioe) {

System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();

} /* try / catch (ioe)*/

} /* main(String[] args) */

} /* class Tcp_server */


/*page --------------------------------------------------------------------- */
class doComms implements Runnable {

private Socket server;
private String line;
private String input;


/*page ----------------------------------------------------------------- */
doComms(Socket server) {

this.server = server;

} /* doComms(Socket server) */


/*page ----------------------------------------------------------------- */
public void run() {

input = "";

try {

/* ------------------------------------------------------------- */
/* GET INPUT FROM THE CLIENT */
/* ------------------------------------------------------------- */
DataInputStream in = new DataInputStream(server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());

while ((line = in.readLine()) != null && !line.equals(".")) {

input = input + line;
out.println("RECEIVED:" + line);

} /* while ((line = in.readLine()) != null && !line.equals(".")) */

/* ------------------------------------------------------------- */
/* NOW WRITE TO THE CLIENT */
/* ------------------------------------------------------------- */
System.out.println("FULL MESSAGE IS:" + input);
out.println("OVERALL MESSAGE IS:" + input);

// server.close();
} catch (IOException ioe) {

System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();

} /* try / catch (ioe) */

} /* run() */

} /* class doComms */

There is no error message, but no data is passed to the socket server.

AlexBrinister
27-02-2014, 23:54
I would recommend using NetworkTables for something like that. FIRST provides a NetworkTables plugin for RoboRealm. I would opt for that seeing as NetworkTables has a lot of work behind it.

But anyway... No error messages? Have you tried running this in debug mode?

Alex Brinister