Android 聊天室(二)

摘要:
在使用套接字完成了一个简单聊天室的开发后,这位博主决定开发注册和登录功能。当收到“登录”请求时,检查数据库以查看是否存在与客户端发送的条目具有相同用户名和密码的条目。如果是,返回“ok”表示“登录成功”。否则,返回“error”表示“登录失败”。

在完成了使用socket进行简单的聊天室的开发之后,博主决定进行注册和登陆功能的开发。这也是为了在后期实现更多的功能时必不可少的一个工作。 注册和登录的大概流程如下:

1. 用xampp软件搭建本地服务器,并新建数据库用于存放注册用户的注册信息

2. 使用php语言编写App接口

3. 编写客户端代码,实现注册和登陆功能

接下来,我就按照这三大块儿进行详细的介绍:

  • 服务器和数据库的搭建 

     有关这部分的内容,在我以前的博客《ClientToServer》中有所介绍,在这里就不再重复介绍。

  • App接口的实现

     App的借口部分主要实现的是根据客户端的请求对数据库进行相应的操作:接收到“注册”请求时,首先查询数据库中是否已经存在此用户,如果存在则返回“exist”给客户端,告知“此用户名已被占用,请重新输入”,如果不存在,则将此用户名和密码插入到数据库中,并返回“ok”表示“注册成功”,如果数据插入失败,则返回“error”表示“注册失败”。当接收到“登录”请求时,则在数据库中查找是否存在用户名&密码与客户端发过来的均一致的条目,如果存在,则返回“ok”表示“登录成功”,反之,返回“error”表示“登录失败”。注册的接口文件 login.php:

<?php
$conn = mysql_connect("localhost","root","");
if(!$conn){
    die("conn error");
}
$db = mysql_select_db("siguoyi", $conn);
mysql_set_charset('utf8');

$jsonString = $_POST["jsonString"];
$jsonString = str_replace('"','"',$jsonString);
$obj=json_decode($jsonString);

$username = $obj->username;
$password = $obj->password;
$state = $obj->state;

$sql1 = "SELECT * FROM client WHERE (`username` = '$username')";
$resultNew1 = mysql_query($sql1, $conn);
if(mysql_num_rows($resultNew1) < 1){
try {
    $sql = "INSERT INTO `client`
    (`username`,`password`,`state`) VALUES ('$username','$password','$state')";
    //echo $sql;
    $resultNew = mysql_query($sql, $conn);
    if (!$resultNew) {
        echo "error";
    }else{
        echo "ok";
    }
    $insert_id=mysql_insert_id();
} catch (Exception $e) {}
}else {
    echo "exist";
}
?>

登录的接口文件 sign.php:

<?php
$conn = mysql_connect("localhost","root","");
if(!$conn){
    die("conn error");
}
$db = mysql_select_db("siguoyi", $conn);
mysql_set_charset('utf8');

$jsonString = $_POST["jsonString"];
$jsonString = str_replace('"','"',$jsonString);
$obj=json_decode($jsonString);

$username = $obj->username;
$password = $obj->password;


    $sql = "SELECT * FROM client WHERE (`username` = '$username' and `password` = '$password')";
    
    $resultNew = mysql_query($sql, $conn);
    
    if (mysql_num_rows($resultNew) < 1 ) {
        echo "error";
    }else{
        echo "ok";
    }
?>
  • 客户端功能实现
     客户端主要功能为获取用户注册或者登录时所输入的用户名及密码,并将信息通过json进行上传,并通过接收接口返回的信息来判断此次操作是否成功,然后进行之后的功能执行或者页面跳转。

注册模块的代码 Login.java

public class Login extends Activity{

    private static final String tag ="Login";
    private EditText et_username;
    private EditText et_password;
    private Button bt_login_confirm;
    private Button bt_login_cancel;
    private Handler mHandler;
    
    JSONObject jsonObject = new JSONObject();
    private String Url = "http://10.105.36.51/new/login.php";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_layout);
        
        et_username = (EditText) findViewById(R.id.et_username);
        et_password = (EditText) findViewById(R.id.et_password);
        bt_login_confirm = (Button) findViewById(R.id.bt_login_confirm);
        bt_login_cancel = (Button) findViewById(R.id.bt_login_cancel);
        
        mHandler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                    Log.v(tag, "handle msg: "+msg.obj);
                    String s = msg.obj.toString().trim();
                    char[] cc = s.toCharArray();
                    String sb ="";
                    for(int i = 1; i < cc.length; i++ ){
                        sb+=cc[i];
                    }
                    
                    Log.v(tag, sb+","+sb.hashCode()+","+"exist".hashCode());
                    if(sb.equals("ok")){
                        Toast.makeText(Login.this, "注册成功!", Toast.LENGTH_SHORT).show();
                        et_username.setText("");
                        et_password.setText("");
                        Login.this.finish();
                        Intent intent = new Intent(Login.this, SignIn.class);
                        startActivity(intent);
                    } else 
                        if(sb.equals("error")){
                            Toast.makeText(Login.this, "注册失败,请重试", Toast.LENGTH_SHORT).show();
                    } else 
                        if(sb.equals("exist")){
                            Log.v(tag, "此用户名已被占用,请重新输入");
                            Toast.makeText(Login.this, "此用户名已被占用,请重新输入", Toast.LENGTH_SHORT).show();
                    }
                }
            
            
        };
        
        bt_login_confirm.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                String username = et_username.getText().toString();
                String password = et_password.getText().toString();
                int state = 0;
                
                try {
                    jsonObject.put("username", username);
                    jsonObject.put("password", password);
                    jsonObject.put("state", state);
                    

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                Log.v(tag, "json" + jsonObject);
                new Thread(){

                    @Override
                    public void run() {
                        Utils upload = new Utils(Url, jsonObject);
                        String result = upload.upData();
                        Log.v(tag, "result:" + result+","+result.hashCode());
                        
                        Message msg = new Message();
                        msg.obj = result;
                        mHandler.sendMessage(msg);
                    }
                    
                }.start();    
            }
        });
        
        bt_login_cancel.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {                
                Login.this.finish();
            }
        });        
        
    }
}

登录模块的代码 SignIn.java

public class SignIn extends Activity{

    private static final String tag = "SignIn";
    
    private EditText et_username_sign;
    private EditText et_password_sign;
    private Button bt_sign_confirm;
    private Button bt_sign_cancel;
    
    private Handler mHandler;
    
    JSONObject jsonObject = new JSONObject();
    private String Url = "http://10.105.36.51/new/sign.php";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.signin_layout);
        
        et_username_sign = (EditText) findViewById(R.id.et_sign_username);
        et_password_sign = (EditText) findViewById(R.id.et_sign_password);
        bt_sign_confirm  = (Button) findViewById(R.id.bt_sign_confirm);
        bt_sign_cancel = (Button) findViewById(R.id.bt_sign_cancel);
        
        mHandler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                    Log.v(tag, "handle msg: "+msg.obj);
                    String s = msg.obj.toString().trim();
                    char[] cc = s.toCharArray();
                    String sb ="";
                    for(int i = 1; i < cc.length; i++ ){
                        sb+=cc[i];
                    }
                    
                    Log.v(tag, sb+","+sb.hashCode()+","+"exist".hashCode());
                    if(sb.equals("ok")){
                        Toast.makeText(SignIn.this, "登录成功!", Toast.LENGTH_SHORT).show();
                        et_username_sign.setText("");
                        et_password_sign.setText("");
                        SignIn.this.finish();
                        
                    } else 
                        if(sb.equals("error")){
                            Toast.makeText(SignIn.this, "登录失败,请重试", Toast.LENGTH_SHORT).show();
                    } 
                }
            
            
        };
        
        bt_sign_confirm.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                String username = et_username_sign.getText().toString();
                String password = et_password_sign.getText().toString();
                
                try {
                    jsonObject.put("username", username);
                    jsonObject.put("password", password);
                    

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                Log.v(tag, "json" + jsonObject);
                new Thread(){

                    @Override
                    public void run() {
                        Utils upload = new Utils(Url, jsonObject);
                        String result = upload.upData();
                        Log.v(tag, "result:" + result);
                        
                        Message msg = new Message();
                        msg.obj = result;
                        mHandler.sendMessage(msg);
                    }
                    
                }.start();    
                
            }
        });
        
        bt_sign_cancel.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                SignIn.this.finish();
            }
        });
    }
    
}

网络模块的代码 Utils.java

public class Utils {
    
    private static final String tag = "Utils";
    private String uploadDataURL = null;
    private String jsonObject;

    public Utils(String uploadDataURL, JSONObject jsonObject) {
        this.uploadDataURL = uploadDataURL;
        this.jsonObject = jsonObject.toString();
    }

    public Utils(String uploadDataURL, String jsonObject) {
        this.uploadDataURL = uploadDataURL;
        this.jsonObject = jsonObject;

    }

    public String upData() {
        String resultID = "-1";
        

        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
        nameValuePair.add(new BasicNameValuePair("jsonString", jsonObject));
        InputStream inputStream = null;

        try {
            HttpClient httpClient = new DefaultHttpClient();
            
            HttpPost httpPost = new HttpPost(uploadDataURL);
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8"));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            
            inputStream = httpEntity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line = "";
            String result = "";
            if((line = reader.readLine()) != null){
                
                resultID = line;
                Log.v(tag, resultID);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return resultID;
    }
}

免责声明:文章转载自《Android 聊天室(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JRE_HOME environment variable is not defined correctly This environment variableis needed to run this programCharles https乱码处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django Channels 入门指南

http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django 今天,我们很高兴请到Jacob Kaplan-Moss。Jacob是来自Herokai,也是 Django的长期的核心代码贡献者,他将在这里分享一些他对某些...

如何制作一个简易的web聊天室(思路)

在这里我先把自己的思路分享一下:   聊天室的静态资源如聊天室的外观一类,使用静态的html直接编写。   聊天消息则通过ajax去数据库读取并动态输出在页面上,同时设置好定时函数 ,让数据聊天消息在固定周期内不断刷新,这样就实现了聊天室数据的实时更新,注意的是在每次重新输出聊天消息时,要把之前的的消息清除,否则会出现消息的重复。   最后就是发送功能,放...

Android 聊天室(一)

         为了提高自己在Android开发上的能力,博主决定写一个类似于QQ、微信的聊天软件。不过,简单的想想之后发现,要实现这样的一个聊天软件,需要学习和掌握的东西还很多。作为一个Android开发的小白,也没有足够的实力能很快对这个APP的开发有很大的突破。          于是,博主参考《疯狂Android讲义》中关于“Android网络...

C/C++ 开发一款多人聊天室

基于UDP协议实现 服务端代码: // Test_Console.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <WinSock2.h> #include <WS2tcpip.h> #include <Window...

简单的聊天室代码php+swoole

php swoole+websocket 客户端代码 <!DOCTYPE html> <html> <head> <title></title> <meta name="viewport"content="width=device-width,initial-scal...

C# SignalR 即时通讯 聊天室

一.SignalR简介 SignalR:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。实现实时服务器与客户端通信。是一个开源.NET 库生成需要实时用户交互或实时数据更新的 web 应用程序。 SignalR的出现,让页面通过javascript可以很简单的调用后端服务的方法,而在后端也可以很简单的直接调用...