基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类

原创 2006年06月06日 07:10:00

客户端很简单,就是开一个线程处理用户的数据发送和接收,并做出相应的界面处理。

由于其简单,我就不再罗嗦,看代码:

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端

输入聊天内容

显示呢称和说话内容

基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类

服务器端也很简单,就是开一个ServerSocket监听Client端的连接,如果有连接,就把此连接加入到一个List中。之所以这样处理,是为了管理用户连接,比如将来你可能需要增加给特定的用户发送私人...
  • ai_ma_ai
  • ai_ma_ai
  • 2015年12月29日 13:37
  • 1299

基于TCP/IP的手机聊天游戏(附带源码和解释)之服务器端类

服务器端也很简单,就是开一个ServerSocket监听Client端的连接,如果有连接,就把此连接加入到一个List中。之所以这样处理,是为了管理用户连接,比如将来你可能需要增加给特定的用户发送私人...
  • itkbase
  • itkbase
  • 2008年01月03日 09:29
  • 153

基于TCP/IP的手机聊天游戏(附带源码和解释)之共享类

声明:这是一个Client基于J2ME以及TCP/IP协议的简单的聊天程序,在本人模拟器上测试没问题,但并不保证真机上会出现问题。代码以及整个游戏框架你可以拿来自由使用,但请注明出处。(一)这部分是程...
  • itkbase
  • itkbase
  • 2008年01月03日 09:29
  • 201

基于TCP/IP的手机聊天游戏(附带源码和解释)之共享类

声明:这是一个Client基于J2ME以及TCP/IP协议的简单的聊天程序,在本人模拟器上测试没问题,但并不保证真机上会出现问题。代码以及整个游戏框架你可以拿来自由使用,但请注明出处。(一)这部分是程...
  • dongfengsun
  • dongfengsun
  • 2006年06月06日 06:46
  • 1374

使用TCP/IP协议实现聊天程序

TCP/IP协议的传输即面向点到点的传输方式!   1.创建应用程序   选择“NEW”菜单下的“Application”选项,创建一个普通的应用程序。   2.创建所需控件   首...
  • u014802181
  • u014802181
  • 2015年11月12日 10:49
  • 591

TCP/IP通信 客户端、服务器 实例

本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例。该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即: 127.0.0.1,...
  • qingzai_
  • qingzai_
  • 2016年03月22日 14:00
  • 1366

JAVA程序设计:基于TCP协议的聊天程序

一、程序实现的功能: 1、进入客户端界面 2、创建昵称 3、群发信息 4、@私聊 5、下线通知 6、在线人数统计 二、整体架构图: ...
  • mmayanshuo
  • mmayanshuo
  • 2017年11月12日 14:35
  • 715

TCP/IP简易聊天软件C++实现 - 应用层协议

第一步:需求 软件需要实现的功能: 0.登录  1.私聊   2.群聊  3.文件传输 第二步:考虑使用的网络通信协议。 鉴于ICQ使用的TCP协议,采用TCP实现聊天和文件传输。因为服务器端...
  • han6771306
  • han6771306
  • 2014年04月19日 23:22
  • 1509

Android_TCP/IP开发——聊天室模型(客户端与服务器进行通信)

 TCP/IP 是Transmission Control Protocol/Intemet Protocol的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通信协议,这个协议是Inte...
  • yan8024
  • yan8024
  • 2015年06月12日 17:41
  • 1084

Unity基于TCP/IP的小聊天室实现

要发送字节数组封装类 现在的功能只是发送字符串,也可以改造成传输更多数据类型的类using System; using System.Net.Sockets;//为了避免粘包半包情况 //这个类用来...
  • u012740992
  • u012740992
  • 2015年07月25日 14:47
  • 2913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于TCP/IP的手机聊天游戏(附带源码和解释)之客户端类
举报原因:
原因补充:

(最多只允许输入30个字)