呵呵,放了一长假回来了!期待已久的假期结束了。趁着这闲工夫来完结这Android聊天室的开发。好了,让我们开始吧。

在(四)中,我们已经把服务端的程序开发完毕了!自我感觉讲的蛮详细的!接下来要开发的就是Android手机客户端了。先来看下客户端运行界面吧,截图如下:

界面效果就是这样,简单吧。下面我们就来开发这个项目的客户端。

1、创建一个Android项目,命名为ChatAndroidClient;

2、编写布局文件,这个布局应该难不倒大家,直接上代码,如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"     android:padding="5px"    android:layout_margin="0px"    android:background="@drawable/background_image">    <TextView         android:id="@+id/nameText"        android:layout_width="70px"        android:layout_height="40px"        android:paddingTop="7px"        android:text="用户名:"        android:textColor="@color/black"        android:gravity="right"/>    <EditText         android:id="@+id/name"        android:layout_width="180px"        android:layout_height="40px"        android:layout_toRightOf="@id/nameText"/>    <Button         android:id="@+id/login"        android:layout_width="wrap_content"        android:layout_height="40px"        android:layout_toRightOf="@id/name"        android:text="登陆"/>    <TextView         android:id="@+id/ipText"        android:layout_width="70px"        android:layout_height="40px"        android:gravity="right"        android:layout_below="@id/nameText"        android:layout_alignParentLeft="true"        android:textColor="@color/black"        android:paddingTop="7px"        android:text="IP地址:"/>    <EditText         android:id="@+id/ip"        android:layout_width="180px"        android:layout_height="40px"        android:layout_toRightOf="@id/ipText"        android:layout_alignTop="@id/ipText"        android:digits=".1234567890"        />    <Button         android:id="@+id/leave"        android:layout_width="wrap_content"        android:layout_height="40px"        android:layout_toRightOf="@id/ip"        android:layout_alignTop="@id/ipText"        android:text="退出"/>    <EditText         android:id="@+id/history"        android:layout_width="fill_parent"        android:layout_height="280px"        android:editable="false"        android:gravity="top"        android:layout_below="@id/ipText"        android:textSize="12px"/>    <EditText         android:id="@+id/message"        android:layout_width="270px"        android:layout_height="80px"        android:layout_below="@id/history"        android:textSize="12px"        android:gravity="top"/>    <Button         android:id="@+id/send"        android:layout_width="wrap_content"        android:layout_height="80px"        android:layout_toRightOf="@id/message"        android:layout_alignTop="@id/message"        android:text="发送"/></RelativeLayout>

3、编写主程序Activity,具体代码如下:

package com.wyf.wpf;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Enumeration;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class ChatAndroidClientActivity extends Activity implements OnClickListener, Runnable{//声明登录名、ip地址、消息对话框、信息private EditText usernameEdit;private EditText ipEdit;private EditText historyEdit;private EditText messageEdit;//声明登陆、发送、离开等按钮private Button loginButton;private Button sendButton;private Button leaveButton;//声明用户名、ip地址、聊天内容、信息输入等字段private String username,ip,chat_txt,chat_in;private static final int PORT=8521;//客户端socket用于向服务器发送信息Socket socket;//线程,及时更新信息框中内容Thread thread;//声明客户端数据输入输出流DataInputStream in;DataOutputStream out;//是否登陆的标志boolean flag=false;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //初始化相关编辑框对象        usernameEdit=(EditText)findViewById(R.id.name);        ipEdit=(EditText)findViewById(R.id.ip);        ipEdit.setText("192.168.0.197");        historyEdit=(EditText)findViewById(R.id.history);        messageEdit=(EditText)findViewById(R.id.message);        //初始化按钮并注册相关单击事件        loginButton=(Button)findViewById(R.id.login);        loginButton.setOnClickListener(this);        leaveButton=(Button)findViewById(R.id.leave);        leaveButton.setOnClickListener(this);        sendButton=(Button)findViewById(R.id.send);        sendButton.setEnabled(false);//设置不可用        sendButton.setOnClickListener(this);    }    //按钮单击事件处理@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.login://登陆login();break;case R.id.leave://退出leave();break;case R.id.send://发送send();break;}}//登陆函数public void login(){username=usernameEdit.getText().toString();ip=ipEdit.getText().toString();if(username!=null&&!username.equals("")&&username!="用户输入"&&ip!=null){try {//构建客户端Socket对象socket=new Socket(ip,PORT);//创建客户端输入输出流,用于对服务器发送或接受数据in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());//得到当前事件Date now=new Date(System.currentTimeMillis());//设置事件显示格式SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");String nowStr=format.format(now);//服务器端输出数据,一个登陆名只需提示一次登入成功就可以了if(flag==false){out.writeUTF("$  "+username+"  "+nowStr+"上线了!");}}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//开启线程,监听服务器是否有新的消息,如果有则及时更新thread=new Thread(ChatAndroidClientActivity.this);thread.start();//说明已经登陆成功flag=true;if(flag){usernameEdit.setEnabled(false);//设置不能再登陆loginButton.setEnabled(false);sendButton.setEnabled(true);//设置发送信息按钮可用}}//判断如果登陆名为空,并且flag=false时则提示如下else{if(flag==false){Toast.makeText(ChatAndroidClientActivity.this,"您还没登陆,请登陆!",Toast.LENGTH_SHORT).show();}}}//退出聊天系统函数public void leave(){//先判断是否是登陆状态,如果是则执行下面,如果不是,则提示if(flag==true){if(flag==false){Toast.makeText(ChatAndroidClientActivity.this,"您还没登陆,请登陆!",Toast.LENGTH_SHORT).show();return;}try{//设置为空usernameEdit.setText("");//提示下线信息out.writeUTF("<"+username+">  "+"下线了!");//关闭socket,记住把输入输出流关闭先out.close();in.close();socket.close();}catch(IOException e){}}flag=false;Toast.makeText(ChatAndroidClientActivity.this,"已退出!",Toast.LENGTH_SHORT).show();System.exit(0);ChatAndroidClientActivity.this.finish();}//发送聊天信息函数public void send(){//如果还没登陆,则提示没登陆信息if(flag==false){Toast.makeText(ChatAndroidClientActivity.this,"您还没登陆,请登陆!",Toast.LENGTH_LONG).show();return;}//取得发送聊天信息内容chat_txt=messageEdit.getText().toString();//如果为空,则提示if(chat_txt==null||chat_txt.equals("")){Toast.makeText(ChatAndroidClientActivity.this,"发送内容不能为空,请重新输入!",Toast.LENGTH_SHORT).show();}//如果不为空else{//对时间进行相关处理Date now=new Date(System.currentTimeMillis());SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");String nowStr=format.format(now);//在history对话框中显示聊天内容try {out.writeUTF(username+"  "+nowStr+"说:\n"+chat_txt);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//清空输入框messageEdit.setText("");}}//客户端启动后的动作@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {//读取服务器发送来得数据信息chat_in=in.readUTF();chat_in=chat_in+"\n";//发送消息,要求刷新界面myHandler.sendMessage(myHandler.obtainMessage());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*由于Android是现成安全的,不能在非主线程更新界面,因此定义了一个Handler用于刷新界面*/Handler myHandler=new Handler(){public void handleMessage(android.os.Message msg) {//将信息显示在客户端history的对话框中historyEdit.append(chat_in);super.handleMessage(msg);};};}

鉴于在代码中有非常丰富的注释,在此,不多说什么。

4、操作说明:

(1)、先运行服务端的Server.java文件,弹出java小窗口,之后单击启动服务按钮。接着运行这个Android客户端项目。直到出现上面界面为止。

这里需要注意下:界面上得IP地址是我电脑上得本地地址,所以在这里,诸位需要改为你们自己的本地地址。这里灰常重要,切记,切记。

(2)、出现上面的界面之后,我们输入登陆名,之后单击登陆按钮,则会出现下面情况,截图如下:


客户端 服务端

(3)接着,在底下输入框中,输入我们要想说得话,单击发送按钮,情况改变如下:

客户端 服务端

(4)、我们可以运行多个模拟器,来输入不同的登陆名来进行聊天,这里就不演示了。

5、好了,整个项目到此就结束了!谢谢!

更多相关文章

  1. 对新浪微博android客户端中ListView的实现
  2. (Android) 如何使用HOOK实现动态注入以及自动化操作
  3. Android中即时通讯协议选择
  4. Skype for Business预览版已登陆Android和iOS平台
  5. 2020字节跳动客户端实习春招三轮面试
  6. android_项目_知识积累_mina通信(android手机登录功能)
  7. android基于XMPP的消息推送机制
  8. 基于Mqtt协议Paho项目实现Android消息推送
  9. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(三)——搭建

随机推荐

  1. 安卓 Android之开发简单小应用(一)
  2. Android联系人表结
  3. 安卓中contentDescription属性的作用详解
  4. Android图片自适应不同分辨率屏幕问题
  5. android中的apk签名
  6. GifView控件,android显示gif图片
  7. Android OOM内存溢出解决方案之一
  8. Android Studio 进阶配置
  9. 最好的5个Android(安卓)ORM框架
  10. 浅谈:Android(安卓)TextView的append方法