package socket;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class SocketMIDlet extends MIDlet implements CommandListener {
 private static final String SERVER = "Server";
 private static final String CLIENT = "Client";
 private static final String[] names = { SERVER, CLIENT };
 private static Display display;
 private Form f;
 private ChoiceGroup cg;
 private boolean isPaused;
 private Server server;
 private Client client;
 private Command exitCommand = new Command("Exit", Command.EXIT, 1);
 private Command startCommand = new Command("Start", Command.ITEM, 1);
 public SocketMIDlet() {
display = Display.getDisplay(this);
f = new Form("Socket Demo");
cg = new ChoiceGroup("Please select peer", 
Choice.EXCLUSIVE, names,null);
f.append(cg);
f.addCommand(exitCommand);
f.addCommand(startCommand);
f.setCommandListener(this);
display.setCurrent(f);
 }
 public boolean isPaused() {
return isPaused;
 }
 public void startApp() {
isPaused = false;
 }
 public void pauseApp() {
isPaused = true;
 }
 public void destroyApp(boolean unconditional) {
if (server != null) {
 server.stop();
}
if (client != null) {
 client.stop();
}
 }
 public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
 destroyApp(true);
 notifyDestroyed();
} else if (c == startCommand) {
 String name = cg.getString(cg.getSelectedIndex());
 if (name.equals(SERVER)) {
server = new Server(this);
server.start();
 } else {
client = new Client(this);
client.start();
 }
}
 }
}
package socket;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class Server implements Runnable, CommandListener {
 private SocketMIDlet parent;
 private Display display;
 private Form f;
 private StringItem si;
 private TextField tf;
 private boolean stop;
 private Command sendCommand = new Command("Send", Command.ITEM, 1);
 private Command exitCommand = new Command("Exit", Command.EXIT, 1);
 InputStream is;
 OutputStream os;
 SocketConnection sc;
 ServerSocketConnection scn;
 Sender sender;
 
 public Server(SocketMIDlet m) {
parent = m;
display = Display.getDisplay(parent);
f = new Form("Socket Server");
si = new StringItem("Status:", " ");
tf = new TextField("Send:", "", 30, TextField.ANY);
f.append(si);
f.append(tf);
f.addCommand(exitCommand);
f.setCommandListener(this);
display.setCurrent(f);
 }
 public void start() {
Thread t = new Thread(this);
t.start();
 }
 public void run() {
try {
 si.setText("Waiting for connection");
 scn = (ServerSocketConnection) Connector.open("socket://:5009");
 // Wait for a connection.
 sc = (SocketConnection) scn.acceptAndOpen();
 si.setText("Connection accepted");
 is = sc.openInputStream();
 os = sc.openOutputStream();
 sender = new Sender(os);
 
 // Allow sending of messages only after Sender is created
 f.addCommand(sendCommand);
 while (true) {
StringBuffer sb = new StringBuffer();
int c = 0;
while (((c = is.read()) != '\n') && (c != -1)) {
 sb.append((char) c);
}
if (c == -1) {
 break;
}
si.setText("Message received - " + sb.toString());
 }
 stop();
 si.setText("Connection is closed");
 f.removeCommand(sendCommand);
} catch (IOException ioe) {
 if (ioe.getMessage().equals("ServerSocket Open")) {
Alert a = new Alert("Server", 
"Port 5000 is already taken.",null, AlertType.ERROR);
a.setTimeout(Alert.FOREVER);
a.setCommandListener(this);
display.setCurrent(a);
 } else {
if (!stop) {
 ioe.printStackTrace();
}
 }
} catch (Exception e) {
 e.printStackTrace();
}
 }
 public void commandAction(Command c, Displayable s) {
if (c == sendCommand && !parent.isPaused()) {
 sender.send(tf.getString());
}
if ((c == Alert.DISMISS_COMMAND) || (c == exitCommand)) {
 parent.notifyDestroyed();
 parent.destroyApp(true);
}
 }
/**
* Close all open streams
*/
 public void stop() {
try {
 stop = true;
 if (is != null) {
is.close();
 }
 if (os != null) {
os.close();
 }
 if (sc != null) {
sc.close();
 }
 if (scn != null) {
scn.close();
 }
} catch (IOException ioe) {
 }
}
}
package socket;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class Client implements Runnable, CommandListener {
 private SocketMIDlet parent;
 private Display display;
 private Form f;
 private StringItem si;
 private TextField tf;
 private boolean stop;
 private Command sendCommand =
new Command("Send", Command.ITEM, 1);
 private Command exitCommand =
new Command("Exit", Command.EXIT, 1);
 InputStream is;
 OutputStream os;
 SocketConnection sc;
 Sender sender;
 public Client(SocketMIDlet m) {
parent = m;
display = Display.getDisplay(parent);
f = new Form("Socket Client");
si = new StringItem("Status:", " ");
tf = new TextField("Send:", "", 30, TextField.ANY);
f.append(si);
f.append(tf);
f.addCommand(exitCommand);
f.addCommand(sendCommand);
f.setCommandListener(this);
display.setCurrent(f);
 }
 /**
 * Start the client thread
 */
 public void start() {
Thread t = new Thread(this);
t.start();
 }
 public void run() {
try {
 sc = (SocketConnection) Connector.open("socket://localhost:5009");
 si.setText("Connected to server");
 is = sc.openInputStream();
 os = sc.openOutputStream();
 // Start the thread for sending messages - see Sender's main
 // comment for explanation
 sender = new Sender(os);
 
 // Loop forever, receiving data
 while (true) {
StringBuffer sb = new StringBuffer();
int c = 0;
while (((c = is.read()) != '\n') && (c != -1)) {
 sb.append((char) c);
}
if (c == -1) {
 break;
}
// Display message to user
si.setText("Message received - " + sb.toString());
 }
 stop();
 si.setText("Connection closed");
 f.removeCommand(sendCommand);
} catch (ConnectionNotFoundException cnfe) {
 Alert a = new Alert("Client", 
"Please run Server MIDlet first",null, AlertType.ERROR);
 a.setTimeout(Alert.FOREVER);
 a.setCommandListener(this);
 display.setCurrent(a);
} catch (IOException ioe) {
 if (!stop) {
ioe.printStackTrace();
 }
} catch (Exception e) {
e.printStackTrace();
 }
}
public void commandAction(Command c, Displayable s) {
 if (c == sendCommand && !parent.isPaused()) {
sender.send(tf.getString());
 }
 if ((c == Alert.DISMISS_COMMAND) || (c == exitCommand)) {
parent.notifyDestroyed();
parent.destroyApp(true);
 }
}
/**
* Close all open streams
*/
public void stop() {
 try {
stop = true;
 
if (sender != null) {
 sender.stop();
}
if (is != null) {
 is.close();
}
if (os != null) {
 os.close();
}
if (sc != null) {
 sc.close();
}
 } catch (IOException ioe) {
}
}
}
package socket;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import java.io.*;
public class Sender extends Thread {
 private OutputStream os;
 private String message;
 public Sender(OutputStream os) {
this.os = os;
start();
 }
 public synchronized void send(String msg) {
message = msg;
notify();
 }
 public synchronized void run() {
while (true) {
 // If no client to deal, wait until one connects
 if (message == null) {
try {
 wait();
} catch (InterruptedException e) {
}
 }
 if (message == null) {
break;
 }
 try {
os.write(message.getBytes());
os.write("\r\n".getBytes());
 } catch (IOException ioe) {
 ioe.printStackTrace();
}
// Completed client handling, return handler to pool and
// mark for wait
message = null;
 }
}
public synchronized void stop() {
 message = null;
 notify();
}
}