天天看點

J2ME:使用UDP實作聊天室

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import javax.microedition.io.Connector;

import javax.microedition.io.Datagram;

import javax.microedition.io.ServerSocketConnection;

import javax.microedition.io.SocketConnection;

import javax.microedition.io.UDPDatagramConnection;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.TextField;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

public class client extends MIDlet implements CommandListener{

 //private DataOutputStream dos=null;

    //private DataInputStream dis=null;

    //private SocketConnection sc=null;

 private UDPDatagramConnection udc=null;

 private Datagram ugrec=null,ugsend=null;

    private String msg=null;

    private TextField tf_msg=new TextField("輸入聊天資訊", "", 255,TextField.ANY);

    private TextField tf_name=new TextField("輸入昵稱", "", 10,TextField.ANY);

    private Command cmdSend=new Command("send",Command.OK,1);

    private Command cmdlogin=new Command("login",Command.OK,1);

    private Command cmdreturn=new Command("return",Command.BACK,1);

    private Command cmdexit=new Command("exit",Command.EXIT,1);

    private Form f_login=new Form("聊天室登陸");

    private Form f_chat=new Form("聊天室用戶端");

    private Display disp;

    //private String username;

    boolean isrec=false;

 public client() {

  // TODO Auto-generated constructor stub

 }

 protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

  // TODO Auto-generated method stub

   //  close();

 }

 protected void pauseApp() {

  // TODO Auto-generated method stub

 }

 protected void startApp() throws MIDletStateChangeException {

  // TODO Auto-generated method stub

  disp=Display.getDisplay(this);

  disp.setCurrent(f_login);

  f_login.append(tf_name);

  f_login.addCommand(cmdlogin);

  f_login.addCommand(cmdexit);

  f_login.setCommandListener(this);

  f_chat.append(tf_msg);

  f_chat.addCommand(cmdSend);

  f_chat.addCommand(cmdreturn);

  f_chat.setCommandListener(this);

 }

 public void commandAction(Command c, Displayable d) {

  // TODO Auto-generated method stub

  if(c.equals(cmdSend))

  {

   try {

    //dos.writeUTF(tf_msg.getString());

    byte[] b=tf_msg.getString().getBytes();

    ugrec=udc.newDatagram(b, b.length);

    udc.send(ugrec);

    System.out.println(b.length+"client sended");

    //dos.flush();

    tf_msg.setString(null);

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  else if(c.equals(cmdlogin))

  {

   new Thread(new chatThread()).start();

   disp.setCurrent(f_chat);

  }

  else if(c.equals(cmdreturn))

  {

      close();

      disp.setCurrent(f_login);

  }

  else if(c.equals(cmdexit))

  {

   this.notifyDestroyed();

  }

 }

 public void close()

 { isrec=false;}

 class chatThread implements Runnable

 {

  public void run() {

   // TODO Auto-generated method stub

   try {

    //sc=(SocketConnection)Connector.open("socket://127.0.0.1:9999");

                udc=(UDPDatagramConnection)Connector.open("datagram://127.0.0.1:9999");

    f_login.append("本地:"+udc.getLocalAddress());

    //f_login.append("伺服器位址:"+udc.getAddress());

   //dos=sc.openDataOutputStream();

   //dos.writeUTF(tf_name.getString());

    ugsend=udc.newDatagram(tf_name.getString().getBytes(), tf_name.getString().getBytes().length);

    udc.send(ugsend);

   //dis=sc.openDataInputStream();

    ugrec=udc.newDatagram(255);

    udc.receive(ugrec);

    byte[] b=ugrec.getData();

    String str=new String(b,0,ugrec.getLength());

   //f_chat.append(dis.readUTF());

    f_chat.append(str+"/n");

   isrec=true;

   while(isrec)

   { 

   //msg=dis.readUTF();

    ugrec=udc.newDatagram(255);

    udc.receive(ugrec);

        b=ugrec.getData();

     msg=new String(b,0,ugrec.getLength());

     System.out.println(msg+"/n");

     f_chat.append(msg+"/n");

   }

   }catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

   }

  }

 }