İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Zafer Teker
tekzaf@yahoo.com

Cep telefonları için basit bir chat örneği (midlet'ler arasında iletişim)

Giriş

Bu örnekte iki cep teleofunundaki midlet'ler ile bir chat yapıyoruz. Kullanıcı ilk önce nick'ini giriyor. Daha sonra chat formu gösteriliyor. Kullanıcı send komutunu seçinde text field'te yazdığı mesaj server'a gönderiliyor. Get komutunu seçinde server'a gönderilmiş son mesajı alıyor. (Aslında kendisinin görmediği tüm mesajları alması gerekir. Ancak bizim chat örneğimiz sadece en son eklenen mesajı vermekte.)

Server'de MultiMessagesServer.jsp kullanılmaktadır.

Göster Gizle Kopar Satır Gizle Satır Göster
<%!
  static String lastMessage="";
%>
<%
  String message=request.getParameter("message");
  String req=request.getParameter("req");
  String nick=request.getParameter("nick");  
  if(req.equals("GET")){
    %><%=lastMessage%><%
  }else{
    lastMessage=nick+">"+message;
    %>OK<%
  }
%>

MultiMessagesServer JSP son gönderilen mesajı lastMessage değişkeninde tutmakta. Eğer req paremtresi GET olrak verilmişse (mesaj isteniyorsa) lastMessage değişkeni cevap olarak verilir.

%><%=lastMessage%><% 

JSP'de <%,%> işaretleri dışındaki her şey cevap olarak gönderilir. %><%=lastMessage%><% ifadesi lastMessage değişkeninin değerini vermek içindir.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 import javax.microedition.io.*;
  4 import java.util.*;
  5 import java.io.*;
  6 public class ChatMIDlet extends javax.microedition.midlet.MIDlet{
  7     ChatForm form;
  8     public void startApp(){
  9         NickForm nickForm=new NickForm(this,"Chat Form");
 10         Display.getDisplay(this).setCurrent(nickForm);
 11     }
 12     public void pauseApp(){}
 13     public void destroyApp(boolean unconditional){}
 14     public void setNick(String nick){
 15         ChatForm form=new ChatForm("Chat Form",nick);
 16         Display.getDisplay(this).setCurrent(form);        
 17     }
 18 }
 19 class ChatForm extends Form implements CommandListener{
 20     String url="http://localhost:8080/examples/midlet_test/MultiMessagesServer.jsp";
 21     Command sendCommand=new Command("Send",Command.SCREEN,2);
 22     Command getCommand=new Command("Get",Command.SCREEN,1);
 23     TextField messageField;
 24     MessagesBox messagesBox;
 25     String nick="";
 26     public ChatForm(String title,String nick){
 27         super(title);  
 28         this.nick=nick;
 29         messagesBox=new MessagesBox("","");
 30         messageField=new TextField("","",100,TextField.ANY);
 31         append(messageField);
 32         append(messagesBox);
 33         addCommand(sendCommand);
 34         addCommand(getCommand);
 35         setCommandListener(this);
 36     }
 37     public void commandAction(Command c, Displayable d){
 38         if(c==sendCommand){
 39            try{
 40                String s=messageField.getString();
 41                if(s!=null){                   
 42                     String result=send(s);
 43                     messagesBox.append(nick+">"+s);
 44                     messageField.setString("");
 45                }else{
 46                     messagesBox.append("String null");                 
 47                }                
 48            }catch(Exception e){
 49                messagesBox.append("Exception"+e.getMessage()); 
 50            }
 51         }else if(c==getCommand){
 52            try{
 53                String s=get();
 54                if(s!=null){
 55                    messagesBox.append(s.trim());
 56                }else{
 57                    messagesBox.append("String null");
 58                }                
 59            }catch(Exception e){
 60                messagesBox.append("Exception"+e.getMessage()); 
 61            }            
 62         }
 63     }
 64     private String send(String message) throws Exception{
 65         HttpConnection connecton=(HttpConnection)Connector.open(url+"?message="+message+"&nick="+nick+"&req=SEND");
 66         InputStream is=connecton.openInputStream();
 67         StringBuffer buffer=new StringBuffer();
 68         int ch;        
 69         while ((ch=is.read())!=-1) {
 70             buffer.append((char)ch);
 71         }
 72         is.close();
 73         connecton.close();
 74         return buffer.toString();
 75     }
 76     private String get() throws Exception{
 77         StringBuffer sb=new StringBuffer();
 78         InputStream is=Connector.openInputStream(url+"?req=GET");
 79         int ch;
 80         while((ch = is.read())!=-1) {
 81             sb.append((char) ch);
 82         }
 83         return sb.toString();
 84     }            
 85 }
 86 class MessagesBox extends StringItem{
 87     Vector messages=new Vector();       
 88     public MessagesBox(String label, String text){
 89         super(label,text);
 90     }
 91     public void append(String message){
 92        messages.addElement(message);
 93        refresh();
 94     }
 95     public void refresh(){
 96         StringBuffer buffer=new StringBuffer();
 97         for(int i=(messages.size()-1);i>-1;i--){
 98             String message=(String)messages.elementAt(i);
 99             buffer.append(message+"\n");
100         }
101         setText(buffer.toString());
102     }
103 }
104 class NickForm extends Form implements CommandListener{
105     Command okCommand=new Command("Ok",Command.SCREEN,1);
106     TextField field;   
107     ChatMIDlet midlet;
108     public NickForm(ChatMIDlet midlet,String title){
109         super(title);
110         this.midlet=midlet;
111         field=new TextField("Nick:","",100,TextField.ANY);
112         append(field);
113         addCommand(okCommand);
114         setCommandListener(this);
115     }
116     public void commandAction(Command c, Displayable d){
117         if(c==okCommand){
118             String nick=field.getString();
119             midlet.setNick(nick);
120         }
121     }    
122 }

ChatMIDlet yüklendiğinde önce kullanıcının nick'ini almaktadır. Bunun için NickForm class'ı kullanılmıştır. Kullanıcı nick'i girip ok komutunu seçtiğinde

midlet.setNick(nick);

şeklinde midlet'in setNick method'u çağrılır. Bu işlem tamamlanınca chat formu görüntülenir.

ChatForm form=new ChatForm("Chat Form",nick);
Display.getDisplay(this).setCurrent(form);        

alınan nick ChatForm class'ına verilir.

ChatForm formuna mesajların yazıldığı bir TextField, bir de tüm mesajların gösterildiği MessagesBox eklenir. MessagesBox class'ı StringItem'dan extend ettiğimiz bir class'tır. Tüm mesajlar bir vectorde tutulur ve yeni bir mesaj eklendiği zaman append methodu çağrılır. Bu method vectordeki tüm mesajları gösterir. En son eklenen mesaj en üste gözükmesi için mesajlar ters sıradan gösterilirler.

ChatForm'da sendCommand mesaj göndermek için, getCommand mesaj almak için kullanılır. Mesaj göndermek için

HttpConnection connecton=(HttpConnection)Connector.open(url+"?message="+message+"&nick="+nick+"&req=SEND");
InputStream is=connecton.openInputStream();

şeklinde bir InputStream yaratılır. Paramtre olrak message,nick ve req olrakta SEND gönderilir. Daha sonra jsp'den dönen cevap gönderilir. Ancak biz bu cevabı kullanmıyoruz.

Mesaj almak içinse get method'u kullanılır.

InputStream is=Connector.openInputStream(url+"?req=GET");
int ch;
while((ch = is.read())!=-1) {
	sb.append((char) ch);
}

şeklinde InputStream yaratılır. Gelen cevap bir StringBuffer'a eklenir. Bu cevap en son eklenen mesaj olmaktadır.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır