Android进阶高手(五)之Android聊天室(4)---完结篇
16lz
2021-01-26
呵呵,放了一长假回来了!期待已久的假期结束了。趁着这闲工夫来完结这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、好了,整个项目到此就结束了!谢谢!
更多相关文章
- 对新浪微博android客户端中ListView的实现
- (Android) 如何使用HOOK实现动态注入以及自动化操作
- Android中即时通讯协议选择
- Skype for Business预览版已登陆Android和iOS平台
- 2020字节跳动客户端实习春招三轮面试
- android_项目_知识积累_mina通信(android手机登录功能)
- android基于XMPP的消息推送机制
- 基于Mqtt协议Paho项目实现Android消息推送
- 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(三)——搭建