投票器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

posted @ 2013-06-08 16:27  但,我知道  阅读(1941)  评论(1编辑  收藏  举报