最近导师要求我和另一个同学开发一个手机上课签到应用,我负责客户端和服务器之间的通信架构编写和数据的存储
本人大学四年只用过汇编和C/C++,因此对andriod开发还是一窍不通,花了一个星期写出来了基本的通信功能
首先是服务器端的架构:
在网络通信上主要有三类网络通信线程,一是定时多播线程将同一局域网内的教师机ip广播给所有学生机,由于一个AP支持的连接数不多,所以才使用定时多播。二是监听线程,接受学生机的tcp连接然后new出签到事务线程。三是事务线程,处理学生的签到信息和返回签到状态,数据库使用andriod自带的Sqlite,由于会有大量事务线程,因此要做好线程同步问题。
1 //主线程主要代码 2 wifiManager= (WifiManager) getSystemService(Context.WIFI_SERVICE); 3 4 mButton.setOnClickListener(new Button.OnClickListener(){ 5 @Override 6 public void onClick(View v){ 7 mEcho = (TextView)findViewById(R.id.client_text); 8 mEcho.setText("begin"); 9 10 //建立一个监听线程 11 TCPListenThread tcpListenThread = new TCPListenThread(port); 12 tcpListenThread.start(); 13 /* 建立一个多播线程,要在监听线程建立后才开始建立 */ 14 MulticastThread multicastThread = new MulticastThread(wifiManager); 15 multicastThread.start();
1 //多播线程,假设多播一百秒 2 try { 3 Log.i(TAG, "In MulticastThread.run()"); 4 InetAddress address = InetAddress.getByName(multiAdderss); 5 multicastSocket = new MulticastSocket(); 6 //multicast per second 7 for(int i = 0; i != 100; ++i){ 8 String msg = "I'm the teacher, my IP Address is?" + teacherIP; 9 byte[] buf = msg.getBytes(); 10 //Constructs a new DatagramPacket object to send data to the port aPort of the address host. 11 DatagramPacket packet=new DatagramPacket(buf,buf.length,address,port); 12 multicastSocket.send(packet); 13 Thread.sleep(1000); 14 } 15 }catch(UnknownHostException e){ 16 e.printStackTrace(); 17 } catch (IOException e) { 18 e.printStackTrace(); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 super.run();
1 //监听线程 2 public void run(){ 3 Log.i(TAG, "In TCPListenThread.run()"); 4 try { 5 listenSocket = new ServerSocket(mPort); 6 while(true){ 7 CheckinSocket = listenSocket.accept(); 8 //将签到逻辑交给checkinThread处理 9 CheckinThread checkinThread = new CheckinThread(CheckinSocket); 10 checkinThread.start(); 11 12 } 13 } catch (IOException e) { 14 e.printStackTrace(); 15 } 16 super.run(); 17 }
1 //事务线程主要代码 2 public void run(){ 3 Log.i(TAG, "In CheckinThread.run()"); 4 5 try { 6 InputStreamReader input = new InputStreamReader( checkinSocket.getInputStream(),"UTF-8"); 7 8 char[] b = new char[1024]; 9 StringBuilder builder = new StringBuilder(); 10 int i; 11 while(( i = input.read(b)) != -1){ 12 builder.append(b,builder.length(),i); 13 } 14 String msg = builder.toString(); 15 Log.i(TAG, "In CheckinThread.run() msg:"+msg); 16 17 // writeIntoDB(msg);//将msg写入数据库 18 19 checkinSocket.close(); 20 } catch (IOException e) { 21 e.printStackTrace(); 22 } 23 super.run(); 24 }
经多台机子的测试,服务器能正常工作,但由于本人只有一个星期的andriod开发经验,里面的代码难免会有不足和bug,希望各位能指出,谢谢~~