您的位置:首页 > 其它

J2ME实现socket连接实例

2010-05-29 16:40 225 查看
1、SocketMIDlet类

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

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();

            }

        }

    }

}

 

2、Server类

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) {

            ioe.printStackTrace();

        }

    }

}

 

3、Client类

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) {

            ioe.printStackTrace();

        }

    }

}

 

4、Sender类

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) {

                    e.printStackTrace();

                }

            }

            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();

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息