1. 配置环境

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

2. 开启服务端

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

投票器APP demo 1.0版本

3. 开启教师投票器

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

投票器APP demo 1.0版本 投票器APP demo 1.0版本

4. 开启学生投票器

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

投票器APP demo 1.0版本

5. 测试下

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

投票器APP demo 1.0版本

 

 

 

 

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类实现的。找个该类,直接用好了。

投票器APP demo 1.0版本

2.layout文件activity_main.xml文件

VIEW:

投票器APP demo 1.0版本 投票器APP demo 1.0版本

 

CODE:

<core.SlidingMenuView
        android:
        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

相关文章: