基於TCP/IP的手機聊天遊戲(附帶原始碼和解釋)之客戶端類

gudesheng發表於2008-01-03

客戶端很簡單,就是開一個執行緒處理使用者的資料傳送和接收,並做出相應的介面處理。

由於其簡單,我就不再羅嗦,看程式碼:

MIDlet類:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
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;


/**
 * @author 孫東風
 *
 **/

public class ChatMIDlet extends MIDlet implements Runnable,CommandListener{
 
    private static final String SERVER_IP = "127.0.0.1";
    private Command exit = new Command("exit",Command.EXIT,1);
    private GameScreen screen;
    private DataInputStream in;
    private DataOutputStream out;
    private StreamConnection conn;
    private boolean done;
    private int player_id;
   
    public static Display display;

    Form login_form = new Form("登陸介面");
    TextField name_textfield = new TextField("請輸入呢稱 :","",10,TextField.ANY);
    Command loginCommand = new Command("登陸",Command.SCREEN,1);
    static String name;
   
 public ChatMIDlet() {
  super();
  login_form.append(name_textfield);
  login_form.addCommand(loginCommand);
  login_form.setCommandListener(this);
  display = Display.getDisplay(this);
 }


 protected void startApp(){
        try {
            conn = (StreamConnection) Connector.open("socket://"+SERVER_IP+":"+Server.PORT);
            in = new DataInputStream(conn.openInputStream());
            out = new DataOutputStream(conn.openOutputStream());
        } catch (IOException e) {
            closeConnection();
            System.out.println("*** could not connect to server: " + e);
            destroyApp(true);
        }
  Display.getDisplay(this).setCurrent(login_form);
 }
 
 public DataInputStream getInput(){
  return in;
 }
 
 public DataOutputStream getOutput(){
  return out;
 }

//關閉所有資源 
    private void closeConnection() {
        try {
            if (in != null) {
                in.close();
            }

            if (out != null) {
                out.close();
            }

            if (conn != null) {
                conn.close();
            }
        } catch (IOException e) {
            System.out.println(e);
        }
    }
   

 protected void pauseApp() {

 }


 protected void destroyApp(boolean bool){
  System.out.println("MidpTestClient.destroyApp()");
  Message msg = new Message(Message.SIGNOFF, Message.NO_VALUE,null);
  try {
            msg.archive(out);
        } catch (IOException e) {
        }

        closeConnection();
        Display.getDisplay(this).setCurrent(null);
 }

 public void handleStatus(Message msg){
  GameScreen.revStr = msg.getStr();
  screen.repaint();
 }
 
 public void handleError(){
     Message msg = new Message(Message.SIGNOFF, Message.NO_VALUE,null);

        try {
            msg.archive(out);
        } catch (IOException e) {
         e.printStackTrace();
        }
 }
 
 public void handleUnknown(Message msg){
  System.out.println("received unknown message: " + msg);
 }

 public void run() {

      Message msg;

         while (!done) {
             try {
                 msg = Message.createFromStream(in);
             } catch (IOException e) {
                 System.out.println("cant read message from stream");

                 continue;
             }

             switch (msg.getType()) {
             case Message.SERVER_STATUS:
              System.out.println("Client receive SERVER_STATUS");
                 handleStatus(msg);
              break;
             case Message.ERROR:
                 handleError();
                 break;
             default:
                 handleUnknown(msg);
                 break;
             }
         }
  
 }

 public void commandAction(Command cmd, Displayable g) {
        if (cmd == exit) {
            done = true;
            destroyApp(true);
            notifyDestroyed();
        }else if(cmd == loginCommand){
         if(name_textfield.getString().length() != 0){
          name = name_textfield.getString();
          Message msg = new Message(Message.SIGNUP,Message.NO_VALUE,name_textfield.getString());
          try{
           msg.archive(out);
           msg = Message.createFromStream(in);
           if (msg.getType() != Message.SIGNUP_ACK) {
                        System.out.println("*** could not sign up: " + msg);
                        destroyApp(true);
                    }
           
                    player_id = Message.player_id;
                    System.out.println("received sign-up ack, id = " + player_id);  
                    System.out.println("--------------1");
                    screen = new GameScreen();
                    screen.initialize(this, player_id);
                    done = false;
                    Thread thread = new Thread(this);
                    thread.start();
                    Display.getDisplay(this).setCurrent(screen);
          }catch(Exception e){
           System.out.println("*** could not sign up with server: " + e);
                    destroyApp(true);
          }
         }else{
          Alert alert = new Alert("警告","使用者名稱和密碼不能為空",null,AlertType.ERROR);
       alert.setTimeout(Alert.FOREVER);
       Display.getDisplay(this).setCurrent(alert);
               }
          }
    }

}
GameScreen類:

import javax.microedition.lcdui.*;

public class GameScreen extends Canvas implements CommandListener{

 public Form message_form = new Form("Send Message Form");
 public Command sendCommand = new Command("Send",Command.OK,1);
 public Command sendCommand2 = new Command("Send",Command.OK,1);
 public TextField content_textfield = new TextField("Content :","",10,TextField.ANY);
 public String content;
 
 public static String revStr = "null";
 
 public int player_id;
 ChatMIDlet chatmidlet;

 public GameScreen(){
  message_form.append(content_textfield);
  message_form.addCommand(sendCommand2);
  message_form.setCommandListener(this);
  this.addCommand(sendCommand);
  this.setCommandListener(this);
 }

 public void initialize(ChatMIDlet midlet,int player_id){
  this.chatmidlet = midlet;
  this.player_id = player_id;
 }
 
 protected void paint(Graphics g) {
   g.setColor(0x000000);
   g.fillRect(0,0,getWidth(),getHeight());
   g.setColor(0xffffff);
   g.drawString(revStr,0,0,Graphics.LEFT|Graphics.TOP);
 }


 public void commandAction(Command cmd, Displayable g) {
  if(cmd == sendCommand){
   System.out.println("CommandListenning this");
   ChatMIDlet.display.setCurrent(message_form);
  }else if(cmd == sendCommand2){
   content = content_textfield.getString();
   Message msg = new Message(Message.CLIENT_STATUS,player_id,content);
   try{
    msg.archive(chatmidlet.getOutput());
   }catch(Exception e){
    e.printStackTrace();
    System.out.println("Send Message Failed!");
   }
   ChatMIDlet.display.setCurrent(this);
  }
 }

}

後話:希望此文能為3G到來之前吹點熱風,催化催化。

效果圖如下:

輸入呢稱並傳送到Server端

輸入聊天內容

顯示呢稱和說話內容



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=775438


相關文章