Suspend udp server until message arrives

I have a server and a client and i want the server to be under suspend/sleep/wait mode, whatever, until the client sends a string message. I have read about syncronize but i can't make it work properly. Any ideas?

server.java

import java.io.File;

import java.io.FileInputStream;

import java.io.FilenameFilter;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

publicclass Serverextends Thread{

publicstaticvoid main(String[] args)throws IOException{

Server server =new Server();

server.start();// -> run()

}

publicvoid serverThread(){

try{

// Create Image Data File

FileInputStream fisImage;

String serverIP ="10.103.0.33";

InetAddress serverAddress = InetAddress.getByName(serverIP);

String clientIP ="10.103.0.33";

InetAddress clientAddress = InetAddress.getByName(clientIP);

int serverPort = 4445;

int clientPort = 4446;

DatagramSocket txSocket =new DatagramSocket();

DatagramSocket rxSocket =new DatagramSocket(serverPort);

DatagramPacket txPacket;

DatagramPacket rxPacket;

byte[] rxBuffer =newbyte[256];

byte[] txBuffer;

String message ="";

do{

rxPacket =new DatagramPacket(rxBuffer,rxBuffer.length);

message =new String(rxBuffer,0,rxPacket.getLength());

//System.out.println("hey");

}

while (!message.equals(""));

System.out.println(message);

rxSocket.close();

txSocket.close();

}catch (Exception e){

e.printStackTrace(System.err);

}

}

publicvoid run(){

serverThread();

}

}

client.java

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

publicclass Client{

publicstaticvoid main(String[] args)throws IOException{

// Define Server

String serverIP ="10.103.0.33";

InetAddress serverAddress = InetAddress.getByName(serverIP);

int serverPort = 4445;

// Define Client

String clientIP ="10.103.0.33";

InetAddress clientAddress = InetAddress.getByName(clientIP);

int clientPort = 4446;

DatagramSocket txSocket =new DatagramSocket();

DatagramSocket rxSocket =new DatagramSocket(clientPort);

DatagramPacket txPacket;

DatagramPacket rxPacket;

byte[] txBuffer =newbyte[256];

byte[] rxBuffer =newbyte[60000];

String message ="";

// Send start server request

message ="Start";

txBuffer = message.getBytes();

txPacket =new DatagramPacket(txBuffer,txBuffer.length,serverAddress,serverPort);

txSocket.send(txPacket);

socket.close();

}

}

[5659 byte] By [axelinux@hotmail.com] at [2007-11-26 12:17:29]
# 1

I am trying something like the following but with no result.

import java.io.File;

import java.io.FileInputStream;

import java.io.FilenameFilter;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

public class Server extends Thread {

public static void main(String[] args) throws IOException {

Server server = new Server();

server.start(); // -> run()

}

private boolean threadSuspended = true;

public synchronized void inConnection() {

try {

System.out.println("inConnection");

String message = "";

int serverPort = 4445;

DatagramSocket rxSocket = new DatagramSocket(serverPort);

byte[] rxBuffer = new byte[256];

DatagramPacket rxPacket = new DatagramPacket(rxBuffer,rxBuffer.length);

rxSocket.receive(rxPacket);

message = new String(rxBuffer,0,rxPacket.getLength());

if (message.equals("Start"));

threadSuspended = !threadSuspended;

if (!threadSuspended)

notify();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void serverThread() {

try {

// Create Image Data File

FileInputStream fisImage;

String serverIP = "10.103.0.33";

InetAddress serverAddress = InetAddress.getByName(serverIP);

String clientIP = "10.103.0.33";

InetAddress clientAddress = InetAddress.getByName(clientIP);

int serverPort = 4445;

int clientPort = 4446;

DatagramSocket txSocket = new DatagramSocket();

DatagramSocket rxSocket = new DatagramSocket(serverPort);

DatagramPacket txPacket;

DatagramPacket rxPacket;

byte[] rxBuffer = new byte[256];

byte[] txBuffer;

String message = "";

System.out.println(message);

rxSocket.close();

txSocket.close();

} catch (Exception e) {

e.printStackTrace(System.err);

}

}

public void run() {

synchronized(this) {

while (threadSuspended)

try {

System.out.println("Wait");

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("Exit synchonized");

serverThread();

}

}

axelinux@hotmail.com at 2007-7-7 14:55:06 > top of Java-index,Archived Forums,Socket Programming...
# 2
You're making this much more complicated than necessary. You don't need the 'threadSuspended' variable or the wait()/notify() stuff or all those methods talking to each other.Just have the run() method call DatagramSocket.receive() in a loop. It will block until something
ejp at 2007-7-7 14:55:06 > top of Java-index,Archived Forums,Socket Programming...
# 3

I was missing a very important thing "This method (receive) blocks until a datagram is received. "

The following code did my job. You were right. I made it to complicated.

String message = "";

boolean flag = true;

System.out.println("Waiting for connection...");

while(flag) {

rxPacket = new DatagramPacket(rxBuffer,rxBuffer.length);

rxSocket.receive(rxPacket);

message = new String(rxBuffer,0,rxPacket.getLength());

if (message.equals("Start"));

flag = false;

}

axelinux@hotmail.com at 2007-7-7 14:55:06 > top of Java-index,Archived Forums,Socket Programming...