zoukankan      html  css  js  c++  java
  • 投票器APP demo 1.0版本

    成果展示

    1. 配置环境

    就是配置服务器和手机客户端的环境,方法多多,最简单就是pc上开启服务端,然后开启wifi共享,手机联到该共享wifi上,运行客户端即可。

    2. 开启服务端

    服务器会显示服务器与客户端的通信信息,便于测试。

    image

    3. 开启教师投票器

    界面向右滑动,左侧出现发起投票按钮,点击发起投票按钮发起投票,教师投票器就会得到服务器端上的投票状况

    image image

    4. 开启学生投票器

    填写要投票的名字,点击发送按钮来发送

    image

    5. 测试下

    学生投票器发送个“喽”,测试下,看看教师投票器界面

    image

    6. 结束投票

    教师投票器点击结束投票按钮,结束投票,然后学生继续发送名字就会出现提交失败的提示。

    核心代码讲解

    Socket通信

    1.服务端,接听指定端口,当有客户端连接时,开启个新线程用来处理其通信,

       1:  // 创建一个服务器对象,如果端口号超出范围或者已经被占用,则抛出异常
       2:              java.net.ServerSocket so = new java.net.ServerSocket(port);
       3:              // 让服务器进入循环等待状态
       4:              while (true) {// 等待客户机连接,连接后生成一个Socket对象,如果没有客户机连接进来则程序在此阻塞
       5:                  s = so.accept();         
       6:                  System.out.println("连接成功:"+s.getLocalSocketAddress());
       7:                  // 创建ServerThread线程对象,并启动线程
       8:                  ServerThread st = new ServerThread(s, ta);                                   
       9:                  Thread th = new Thread(st);
      10:                  th.start();
      11:              }
      12:          } catch (IOException e1) {
      13:              e1.printStackTrace();
      14:          }

    2.ServerThread类是一个实现runnable接口的类,其run方法代码如下,

       1:  @Override
       2:      public void run() {
       3:                  try {
       4:                      DataInputStream inFromClient=new DataInputStream(s.getInputStream());
       5:                       String ClientSentence = inFromClient.readUTF();
       6:                       ta.append("receive:"+ClientSentence+"\t\n");
       7:                       ClientSentence=HandleMsg(ClientSentence);        
       8:                       out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream(),"UTF-8"));
       9:                       out.write(ClientSentence);
      10:                       out.flush();        
      11:                       ta.append("send:"+ClientSentence+"\t\n");
      12:                       s.close();
      13:                  } catch (IOException e) {
      14:                      e.printStackTrace();
      15:                  }
      16:      }

    这里与一般通信不同,我是考虑到手机网络信号差,故一次连接只进行得到客户端的信息,处理信息,反馈信息一次操作,去掉了无限循环。其中HandleMsg是我自定义的处理信息的方法。

    3.客户端,建立连接,发送消息,接受反馈

       1:  socket=new Socket(IP,12345);
       2:              DataOutputStream outToServer =new DataOutputStream(socket.getOutputStream()); 
       3:              BufferedReader infromServer =  new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); 
       4:              outToServer.writeUTF(str);   
       5:              String modifiedSentence = infromServer.readLine(); 

    右划出发起投票效果

    1.一个继承自viewGroup的SlidingMenuView类,这是个安卓源码workSpace类简化版,安卓手机左右滑动屏幕的效果就是靠这个workSpace类实现的。找个该类,直接用好了。

    image

    2.layout文件activity_main.xml文件

    VIEW:

    image image

    CODE:

    <core.SlidingMenuView
            android:id="@+id/sliding_menu_view"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            
           <LinearLayout 
                android:id="@+id/left_sliding_tab"
                android:background="@android:color/darker_gray"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:padding="5dip"
                android:layout_height="fill_parent">
                <Button
                    android:id="@+id/left_vote_btn"
                    android:text="@string/leftmenu_vote"
                    android:onClick="vote"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                
            </LinearLayout>       
            <FrameLayout 
                android:id="@+id/sliding_body"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
                
            </FrameLayout>  
    </core.SlidingMenuView>

    3.安卓清单

    <activity android:name=".MainPage" >

    MainPage是继承Activity的要放进FrameLayout的

    4.继承ActivityGroup的入口类MainActivity的oncrreat方法

       1:  slidingMenuView = (SlidingMenuView) findViewById(R.id.sliding_menu_view);
       2:           tabcontent = (ViewGroup) slidingMenuView.findViewById(R.id.sliding_body);
       3:           btn=(Button)this.findViewById(R.id.left_vote_btn);
       4:           showDefaultTab();
       5:  //showDefaultTab方法:
       6:  private void showDefaultTab() {
       7:          Intent i = new Intent(this,MainPage.class);
       8:          v1 = getLocalActivityManager().startActivity(MainPage.class.getName(), i).getDecorView();
       9:          tabcontent.removeAllViews();
      10:          tabcontent.addView(v1);
      11:      }

    主线程与其他线程的通信-使用Handler

    1. 主线程

    声明:

       1:  myHandler = new Handler(){
       2:              @Override
       3:              public void handleMessage(Message msg) {//重写处理消息方法
       4:                  switch(msg.what){//判断消息类别
       5:                  case 0: //消息为更新的数据
       6:                      
       7:                      InitTableHead((String)msg.obj);
       8:                      break;
       9:                  }
      10:              }
      11:          };

    使用,用构造函数参数传入新线程:

       1:  DataThread dataThread=new DataThread(myHandler);

    1. 新线程

    构造函数:

    public DataThread(Handler handler){
            this.mHandler=handler;
        }

    使用

       1:  Message m = mHandler.obtainMessage();//创建Message对象
       2:  m.what = 0;//为what字段赋值        SendMsg("Teacher_Visit");
       3:  …   …
       4:  m.obj=modifiedSentence;
       5:  mHandler.sendMessage(m);//发出Message对象

    代码

    https://files.cnblogs.com/haichao/%E6%8A%95%E7%A5%A8app.rar


    作者:但,我知道
    出处:http://www.cnblogs.com/haichao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    iOS
    iOS
    iOS
    Xcodeproject详解
    Swift
    iOS
    iOS
    错误 1 无法将文件“objDebugXXX.exe”复制到“binDebugXXX.exe”。文件“binDebugXXX.exe”正由另一进程使用,因此该进程无法访问该文件
    【转载】SQL注入原理讲解
    在“安装”阶段发生异常。 System.Security.SecurityException: 未找到源,但未能
  • 原文地址:https://www.cnblogs.com/haichao/p/3127018.html
Copyright © 2011-2022 走看看