`
totoxian
  • 浏览: 1074294 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

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端

输入聊天内容

显示呢称和说话内容

分享到:
评论

相关推荐

    java TCP/IP socket 编程(原书第2版)pdf+源码

    Java TCP/IP Socket编程是Java网络通信的核心技术,广泛应用于服务器端和客户端之间的数据传输。这本书的第二版深入探讨了如何使用Java实现TCP/IP协议栈的socket接口,为开发者提供了全面的理论知识和实践指导。 ...

    基于TCP/IP~Android客户端与PC通信源码

    基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。 客户端:一次连接,可发送多次数据。 重点是客户端时时接收...

    基于windows的TCP IP编程基础实例--源码附带详细注释.rar

    本文将深入探讨基于Windows平台的TCP/IP编程基础知识,通过实例和源码注释,帮助初学者和正在学习socket编程的朋友更好地理解和掌握相关知识。 TCP(Transmission Control Protocol)是一种面向连接、可靠的传输...

    Java TCP_IP Socket编程源代码书籍以及附带源码

    Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含一本关于Java TCP/IP Socket编程的书籍及其配套源代码,对于深入理解Socket编程至关重要。 书籍《Java ...

    TCP课设/大作业推箱子 附带论文及源码

    菜鸟入门,有客户端,服务端和推箱子小游戏代码,可以直接运行,附有源代码+10000字论文 温馨提示:游戏简单易懂,适用于java小白或者TCP/IP小白

    基于TCPIP~Android客户端与PC通信源码.zip

    基于TCP~socket,Android客户端与PC通信,客户端源码。已经测试,可用。附带apk,和网络调试助手,方便测试。只需提供服务器的IP和端口号,即可通信。 客户端:一次连接,可发送多次数据。 重点是客户端时时接收...

    Mir2源码完整版(服务端+客户端)

    3. **网络协议**:源码中包含了客户端和服务端通信的网络协议定义,这涉及到游戏的实时性、同步机制,对网络编程有深入研究的开发者能从中学习到TCP/IP、UDP或自定义协议的设计与实现。 4. **多线程编程**:为了...

    modbus TCP dll 动态链接库 源码

    - Modbus TCP是Modbus协议的网络版本,它在标准的TCP/IP协议之上构建,使得不同设备可以通过以太网进行通信。 - Modbus协议基于主从架构,其中一个是主设备(如PLC或计算机),其余为从设备(如传感器、驱动器)。...

    Android手机远程监控源码.zip

    理解TCP/IP协议和HTTP请求响应机制是关键。可能使用到的库有Retrofit、OkHttp或者Volley,它们简化了网络请求的处理。 3. **摄像头接口**: Android提供了Camera API(旧版)和Camera2 API(新版)来访问和控制...

    JAVA网络编程经典视频教程 附带源码

    1. **简单聊天程序**:一个简单的TCP或UDP聊天程序,展示如何建立客户端和服务器之间的实时通信。 2. **文件传输**:使用Java网络编程实现文件的上传和下载,涉及大块数据的分块传输和断点续传。 3. **Web服务器...

    类似QQ的聊天软件JAVA版源码(附设计文档)

    11. **设计文档**:附带的设计文档会详细解释软件的架构设计、模块划分、接口定义等,对于理解和修改源码非常有帮助。 总的来说,通过这个项目,开发者可以学习到JAVA编程的多种实用技术和理论知识,同时也可以提升...

    lwip-2.0.1源码,附带web服务器

    LWIP,全称Lightweight TCP/IP stack,是一款开源、轻量级的TCP/IP协议栈,主要用于嵌入式系统。LWIP-2.0.1是该协议栈的一个版本,相较于早期版本,它在功能、性能和稳定性上都有所提升。这个压缩包包含了LWIP-2.0.1...

    TCP通信示例,附源码,局域网服务器和客户端统一

    附带数据库,完整演示局域网内客户端和服务端的通信。只要客户端填写服务端的IP地址就可以通信,很强大的本地通信示例。使用delphi的TCLIENTSocket控件和TserverSocket控件,实现TCP通讯。 下载试用完毕,请记得给...

    Micrium-Atmel-uCOS-II-TCPIP-AT91SAM9261.rar_AT91SAM9261_atmel_uc

    描述中的"atmel9261网络测试源码TCP/ip"表明压缩包内含有针对AT91SAM9261的TCP/IP协议栈源代码,这些源代码是用于进行网络通信测试的。这通常包括了服务器和客户端的实现,以及数据包的发送和接收功能。 标签中的...

    c++网络聊天系统源码

    【C++网络聊天系统源码】是一个为初学者设计的简单网络聊天程序,它基于传统的客户端-服务器模型,采用C++编程语言实现。这个项目旨在帮助学习者理解网络通信的基本原理,尤其是如何利用socket API进行数据传输。...

    c#视频聊天vs2005源码

    1. **网络编程**:视频聊天应用需要通过网络传输数据,因此会涉及到TCP/IP协议栈,可能使用套接字(Socket)进行网络通信,实现客户端与服务器之间的数据交换。 2. **多媒体处理**:视频聊天需要捕获、编码、解码和...

    C#socket聊天室源码

    2. **TCP与UDP**:Socket有两种主要的工作模式,即基于连接的TCP(Transmission Control Protocol)和无连接的UDP(User Datagram Protocol)。TCP提供可靠的数据传输,保证数据顺序和完整性;UDP则更注重速度,但不...

    C# 网络五子棋源码 vs2005 sqlserver2000 附带说明文档 C/S

    在实际应用中,客户端和服务器通过TCP/IP协议进行通信,客户端发送玩家的落子位置到服务器,服务器验证并更新游戏状态,然后将更新后的棋盘返回给所有客户端。为了确保游戏的实时性,开发者可能采用了异步IO或多线程...

    《windows网络编程》1中文高清 附源码

    该书以中文高清版呈现,便于阅读,同时附带源码,使得理论与实践相结合,帮助读者更好地理解和应用所学知识。 首先,"Windows网络编程"涉及到的是在Windows操作系统环境下,如何进行网络通信的开发工作。Windows...

    深入体验c#项目开发附带CD赠送源码 03 仿QQ聊天系统.

    总结来说,"深入体验C#项目开发附带CD赠送源码 03 仿QQ聊天系统"这一主题涵盖了C#语言基础、网络编程、UI设计、多线程、数据存储等多个关键知识点,对于想要提升C#开发技能的程序员而言,这是一个极佳的实战项目。...

Global site tag (gtag.js) - Google Analytics