课程设计报告课程名称《网络程序设计》课程设计课题名称网络注册登录器专业网络工程班级1102学号01姓名刘龙飞指导教师李远辉2014年9 月12 日湖南工程学院课程设计任务书课程名称网络程序设计课题网络注册登录器专业班级网络工程1102学生姓名刘龙飞学号01指导老师李远辉审批任务书下达日期2014 年9 月1 日任务完成日期2014 年9 月12 日一、课程设计概述1.1 课程设计题目一个基于Android平台的网络程序实现注册,登录1.2 课程设计要求(1)能正确连接外部网络(2) 能实现注册(3) 能实现正确登录(4) 能够在手机上使用该系统二、硬件平台搭建2.1 JDK安装JDK是Java语言的原创者推出的原始开发环境。
采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,有利于理解Java面向对象的设计思想。
在Windows上安装JDK非常简单,访问Oracle官方网站下载页面,网址为/technetwork/indexes/downloads/index.html,也可从其他网站下载。
下载完成后,双击运行JDK安装程序并根据提示设定环境变量。
2.2 Android SDK安装以及系统设置下载好SDK包后,将zip文件解压缩至合适的地方。
在下文中,默认SDK安装目录为$SDK_ROOT 。
●Linux下,打开文件~/.bash_profile或者~/.bashrc,找到设定PATH环境变量的一行,将$SDK_ROOT/tools的完整路径加入其中。
如果没有找到设定PATH变量的行,可以自己添加一行: export PATH=${PATH}:<$SDK_ROOT/tools的完全路径>●Mac下,在home目录中找到文件.bash_profile,和Linux的一样处理。
如果还没有在机器上设定这个文件,可以创建一个.bash_profile文件。
●Windows下,右键点击【我的电脑】,选择【属性】,在【高级】页中,点击【环境变量】按键,在弹出的对话框中双击“系统变量”中的变量“Path”,将$SDK/tools的完全路径加入其中。
通过将$SDK/tools加入系统路径,在运行adb和其它一些命令行工具时就不需要键入完全路径名了。
需要注意到是,当升级了SDK后,如果安装路径有变动的话,不要忘记了更新PATH变量的设置,将其指向变动后的路径。
配置SDK有两种方法:第一种,通过SDK下载器自动下载和配置。
适合网络好,下载速度快的情况;第二种,借助工具下载SDK文件,手工配置。
适合网络不是很好,下载速度慢的情况下。
2.3Eclipse安装以及ADT工具的安装下载Eclipse安装包后,无需安装,只需解压缩,点击“eclipse.exe”文件即可运行。
Android为Eclipse定制了一个插件,即Android Develpoment Tools(ADT),目的是为用户提供一个强大的综合环境用于开发Android应用程序。
ADT扩展了Eclipse的功能,可以让用户快速建立Android项目,创建应用程序界面,在基于Android框架API的基础上添加组件,以及用SDK工具集调试应用程序,甚至导出签名(或未签名)的APKs以便发行应用程序。
安装ADT:启动Eclipse,选择Help>Install New Software,在出现的对话框里,点击Add按钮,在对话框的name 一栏输入"ADT",然后点击Archive...,浏览和选择已经下载的ADT插件压缩文件,点击OK。
返回可用软件的视图,你会看到这个插件,然后选择Developmer Tools,点击Next,最后重启Eclipse。
硬件平台搭建好后,便可以开始创建项目了。
三、软件设计3.1 软件总体设计此软件为一款网络软件,采用CS模式工作,服务器端用C语言编写,客户端为Android应用程序,相互间用socket通信。
3.2服务器端设计先安装好mysql数据库,建立好相关数据库jsb,以及表userinfo( name char[10],password char[10])。
再用C编程连接好数据库,然后在4000端口监听,等待连接,相关逻辑代码如下:while(1){int i=1,j=0,k=0;int tf=1;sockConn=accept(sockSrv,(SOCKADDR *)&addrClient,&len);memset(recvBuf,0,200);recv(sockConn,recvBuf,200,0);while(recvBuf[i]){if(recvBuf[i]=='+'){tf=0;i++;}else{if(tf){username[j]=recvBuf[i];i++;j++;}else{userpaORme[k]=recvBuf[i];i++;k++;}}}switch(recvBuf[0]){case '1':{char mysqlzl [200];memset(mysqlzl,0,200);sprintf(mysqlzl,"insert into userinfo values('%s','%s');",username,userpaORme);printf("%s",mysqlzl);res = mysql_query(my_con,mysqlzl);//用户注册break;}case '2':{char mysqlzl [200];memset(mysqlzl,0,200);sprintf(mysqlzl,"select * from userinfo where name='%s' and password='%s'",username,userpaORme);mysql_query(my_con,mysqlzl); //登陆查询my_res = mysql_store_result(my_con);my_row = mysql_fetch_row(my_res);if( my_row!=NULL ){send(sockConn,"sucess\n",strlen("sucess\n")+1,0);}else{send(sockConn,"failed\n",strlen("failed\n")+1,0);}break;}}closesocket(sockConn);}服务器截图3.3 Android客户端设计次软件包含三个界面,3界面的视图设计分别如下:主界面注册界面登陆成功跳转界面在主界面点击登陆,登陆按钮回调函数首先获取用户名和密码输入框的值,然后用事先规定好的格式将数据传给服务器,再接收服务器的返回信息,如返回sucess,则进入登陆成功跳转界面,否则提示用户名或密码错误。
点击注册按钮进入注册界面后,在完成相关用户名和密码输入之后,点击注册按钮,注册按钮回调函数获取用户名和密码,比较两次输入的密码是否相同,相同的话,按事先规定好的格式将数据传给服务器,注册成功,不相同的话,提示两次密码不同。
四、总结与改进展望在此次课程设计中,不仅了解到了android以及网络编程的有关知识,而且学习了Java语言以及eclipse等编程环境。
有几点需要特别注意:(1)要明确课程设计的要求,想好系统应该包含哪些功能模块。
否则,在软件设计的后期,再想添加新的功能就需要花费大量的时间。
(2)要对android系统有一定的了解。
在软件设计过程中,大量的用到了android系统的四大组件:Activity(提供可视化的界面)、Service(运行在后台的服务程序)、Broadcast Receiver(广播事件处理机制)、Content Provider(使应用程序相互访问数据)。
只有对这些组件熟练掌握后,才能够真正设计出稳健搞笑的多媒体播放器。
(3)要对Java语言熟练掌握。
Android软件开发都是用Java语言写的,而Java 又是由类组成的。
而Java语言本身又含有众多机制,只有深刻理解这些机制后,才能轻松地实现自己想要的功能。
(4)要对界面设计有一定的了解。
Android所有的布局都放在了res/layout中,而所有的菜单选项都放在了res/menu中。
合理的布局对人性化的界面也是至关重要的。
(5)要具备快速上网查资料的能力。
面对从没接触过的知识,要有信心才是最重要的。
另外,网上的很多现成的资料都可借鉴、学习。
在熟练理解了别人的应用程序的基础上,再做二次开发。
个人收获:1.现学现做的能力。
从图书馆借一些参考光盘,对某项内容的原理大致了解后,直接运行它的源代码,先观察效果,给大脑直接的印象,然后再去理解程序。
2.上网查资料的能力。
网络是一个十分强大的信息工具。
网上有大量的Android参考资料以及很多著名的Android论坛,这上面为我提供了大量的有用信息。
尤其是碰到错误时,上网搜一搜,能很快找到解决办法。
3.英语阅读能力。
因为很多资料都是起源于国外,而很多参考书也是英文的。
此外,Android官网以及著名的Android论坛都是英文版,此外,具备一定的英语阅读能力也是非常重要的。
4.与同学间的交流探讨。
大家经常交流,有助于开拓自己的思维,取长补短,共同解决碰到的问题,这正是一个相互学习的过程。
六、附录❖服务器C源码:#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <mysql.h>#include<winsock.h>//发生错误时,输出错误信息,关闭连接,退出程序void error_quit(const char *str, MYSQL *connection){fprintf(stderr, "%s : %d: %s\n",str, mysql_errno(connection),mysql_error(connection));if( connection != NULL )mysql_close(connection);exit(1);}int main(int argc, char *argv[]){MYSQL *my_con;MYSQL_RES *my_res;MYSQL_FIELD *my_field;MYSQL_ROW my_row;int rows, i;int res;WORD wVersionRequested;WSADATA wsaData;SOCKET sockSrv,sockConn;SOCKADDR_IN addrSrv;SOCKADDR_IN addrClient;char sendBuf[200],recvBuf[200];int error,len;char username [10];char userpaORme [20];memset(username,0,10);memset(userpaORme,0,20);my_con = malloc( sizeof(MYSQL) );memset(recvBuf,0,200);//连接数据库mysql_init(my_con);my_con = mysql_real_connect(my_con, "localhost", "root", "abc123", "jsb", 0, NULL, CLIENT_FOUND_ROWS);if( NULL == my_con )error_quit("Mysql Connection fail", my_con);printf("Mysql Connection success\n");wVersionRequested=MAKEWORD(1,1);error=WSAStartup(wVersionRequested,&wsaData);if(error!=0){printf("启动套接字失败");return 0;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) {WSACleanup();return 0;}sockSrv=socket(AF_INET,SOCK_STREAM,0);addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(4000);bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));printf("开始监听\n");listen(sockSrv,5);len=sizeof(SOCKADDR);while(1){int i=1,j=0,k=0;int tf=1;sockConn=accept(sockSrv,(SOCKADDR *)&addrClient,&len);memset(recvBuf,0,200);recv(sockConn,recvBuf,200,0);while(recvBuf[i]){if(recvBuf[i]=='+'){tf=0;i++;}else{if(tf){username[j]=recvBuf[i];i++;j++;}else{userpaORme[k]=recvBuf[i];i++;k++;}}}switch(recvBuf[0]){case '1':{char mysqlzl [200];memset(mysqlzl,0,200);sprintf(mysqlzl,"insert into userinfo values('%s','%s');",username,userpaORme);printf("%s",mysqlzl);res = mysql_query(my_con,mysqlzl);//用户注册break;}case '2':{char mysqlzl [200];memset(mysqlzl,0,200);sprintf(mysqlzl,"select * from userinfo where name='%s' and password='%s'",username,userpaORme);mysql_query(my_con,mysqlzl); //登陆查询my_res = mysql_store_result(my_con);my_row = mysql_fetch_row(my_res);if( my_row!=NULL ){send(sockConn,"sucess\n",strlen("sucess\n")+1,0);}else{send(sockConn,"failed\n",strlen("failed\n")+1,0);}break;}}// printf("Client says:%s\n",recvBuf);closesocket(sockConn);}//释放空间,关闭连接mysql_free_result(my_res);mysql_close(my_con);free(my_con);return 0;}❖Android客户端界面源代码:❖Activity_main.xml<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="用户名"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/username"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="密码"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/userpass"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="登陆"android:id="@+id/dlButton"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册"android:id="@+id/zcButton"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/ztlview"/></LinearLayout>❖zhucei.xml:<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="用户名"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/zcusername"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="密码"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/zcuserpass"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="再次输入密码"/><EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/zcaguserpass"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册"android:id="@+id/zhuceiButton"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="返回"android:id="@+id/BackButton"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/zhuceiynview"/></LinearLayout>❖dlcg.xml:<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="登陆成功"/></LinearLayout>❖MainActivity.java:package com.example1.jsb;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .Socket;import .UnknownHostException;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.widget.*;public class MainActivity extends Activity {public Button button1;public Button button2;public BufferedReader in;public PrintWriter out;public Socket socket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);button1=(Button) this.findViewById(R.id.dlButton);button1.setOnClickListener(new ButtonClickListener());button2=(Button) this.findViewById(R.id.zcButton);button2.setOnClickListener(new ButtonClickListener());}private final class ButtonClickListener implements View.OnClickListener{public void onClick(View v){if(button1==(Button)v){EditText User=(EditText)findViewById(ername);String Username=User.getText().toString();EditText Pass=(EditText)findViewById(erpass);String Userpass=Pass.getText().toString();TextView ztl=(TextView)findViewById(R.id.ztlview);try {socket= new Socket("58.45.180.145", 4000);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);String sendmsg="2"+Username+"+"+Userpass;out.println(sendmsg);String fwq=in.readLine();if(fwq.equals("sucess")){Intent intent = new Intent();// 设置Intent的源地址和目标地址intent.setClass(MainActivity.this, dlcg.class);startActivity(intent);MainActivity.this.finish();}else if(fwq.equals("failed")){ztl.setText("用户名或密码不对!");}else{ztl.setText(fwq);}// socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else if(button2==(Button)v){Intent intent = new Intent();// 设置Intent的源地址和目标地址intent.setClass(MainActivity.this, zhucei.class);startActivity(intent);}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}❖Zhucei.javapackage com.example1.jsb;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .Socket;import .UnknownHostException;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.*;public class zhucei extends Activity {public Button button1;public Button button2;public BufferedReader in;public PrintWriter out;public Socket socket;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.zhucei);button1=(Button) this.findViewById(R.id.zhuceiButton);button1.setOnClickListener(new ButtonClickListener());button2=(Button) this.findViewById(R.id.BackButton);button2.setOnClickListener(new ButtonClickListener());}private final class ButtonClickListener implements View.OnClickListener{public void onClick(View v){if(button1==(Button)v){try {socket= new Socket("58.45.180.145", 4000);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);// String fwq=in.readLine();// socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}EditText User=(EditText)findViewById(R.id.zcusername);String Username=User.getText().toString();EditText Pass=(EditText)findViewById(R.id.zcuserpass);String password=Pass.getText().toString();EditText Apass=(EditText)findViewById(R.id.zcaguserpass);String apassword=Apass.getText().toString();if(password.equals(apassword)){if(out!=null){String SenM ="1"+Username+"+"+password;out.println(SenM);TextViewview1=(TextView)findViewById(R.id.zhuceiynview);view1.setText("注册成功!");}else{TextViewview1=(TextView)findViewById(R.id.zhuceiynview);view1.setText("网络问题注册未成功");}}else{TextViewview1=(TextView)findViewById(R.id.zhuceiynview);view1.setText("两次输入密码不相同,请从新输入!!");}}else if(button2==(Button)v){zhucei.this.finish();}try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}❖dlcg.java:package com.example1.jsb;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .Socket;import .UnknownHostException;import android.os.Bundle;import android.provider.Settings;import android.app.Activity;import android.content.Intent;import android.view.KeyEvent;import android.view.Menu;import android.view.View;import android.widget.*;public class dlcg extends Activity {public Button button1;public Button button2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.dlcg);}private final class ButtonClickListener implements View.OnClickListener{public void onClick(View v){}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}// @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif(keyCode==KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){ Intent i = new Intent(Intent.ACTION_MAIN);i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 注意i.addCategory(Intent.CATEGORY_HOME);startActivity(i);}return super.onKeyDown(keyCode, event);}}1。