投票器APP demo 1.0版本
成果展示
1. 配置环境
就是配置服务器和手机客户端的环境,方法多多,最简单就是pc上开启服务端,然后开启wifi共享,手机联到该共享wifi上,运行客户端即可。
2. 开启服务端
服务器会显示服务器与客户端的通信信息,便于测试。
3. 开启教师投票器
界面向右滑动,左侧出现发起投票按钮,点击发起投票按钮发起投票,教师投票器就会得到服务器端上的投票状况
4. 开启学生投票器
填写要投票的名字,点击发送按钮来发送
5. 测试下
学生投票器发送个“喽”,测试下,看看教师投票器界面
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类实现的。找个该类,直接用好了。
2.layout文件activity_main.xml文件
VIEW:
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对象
代码
作者:但,我知道
出处:http://www.cnblogs.com/haichao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。