/duelos_android/src/com/moob/BT/AcceptThread.java

https://bitbucket.org/jgorozco/ejemplosandroid · Java · 356 lines · 252 code · 65 blank · 39 comment · 7 complexity · d1b0a5f3891ab0b4a3bba48956f60ccf MD5 · raw file

  1. package com.moob.BT;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.io.OptionalDataException;
  6. import com.moob.FB.Utility;
  7. import com.moob.frwk.Disparo;
  8. import com.moob.frwk.Server;
  9. import com.moob.frwk.User;
  10. import android.annotation.TargetApi;
  11. import android.bluetooth.BluetoothAdapter;
  12. import android.bluetooth.BluetoothServerSocket;
  13. import android.bluetooth.BluetoothSocket;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.util.Log;
  17. import android.view.View;
  18. //******************* SERVEUR *********************
  19. //@TargetApi(10)
  20. public class AcceptThread extends Thread {
  21. private final BluetoothServerSocket mmServerSocket;
  22. private BluetoothAdapter bluetoothAdapter;
  23. private ObjectInputStream mmInStream=null;
  24. private ObjectOutputStream mmOutStream=null;
  25. private String message;
  26. private boolean open=false;
  27. private boolean playing=false;
  28. private boolean waitingShoot=false;
  29. private boolean sentShoot=false;
  30. private Handler handler;
  31. private User user = null;
  32. private Server server=null;
  33. private int sdkVersion = 0;
  34. private Disparo clientShoot=null;
  35. private Disparo serverShoot=null;
  36. public AcceptThread() {
  37. Log.d("trace","Thread Serveur constructeur");
  38. BluetoothServerSocket tmp = null;
  39. sdkVersion = android.os.Build.VERSION.SDK_INT; // e.g. sdkVersion := 8;
  40. try { bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  41. Log.d("trace","bt adapter"+bluetoothAdapter.toString());
  42. /*
  43. if (sdkVersion>8) //2.3 and more
  44. tmp = socketSDKversion8plus();
  45. else
  46. tmp = socketSDKversion8andLess();*/
  47. tmp =bluetoothAdapter.listenUsingRfcommWithServiceRecord("jeu", Utility.uuid);
  48. } catch (IOException e) { Log.d("trace","error BTadapter : "+e.getMessage());}
  49. mmServerSocket = tmp;
  50. server = new Server(bluetoothAdapter.getName(),bluetoothAdapter.getAddress());
  51. Log.d("trace","creation server : "+server.toString());
  52. }
  53. @TargetApi(10)
  54. public BluetoothServerSocket socketSDKversion8plus() throws IOException{
  55. BluetoothServerSocket tmp = null;
  56. tmp = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("jeu", Utility.uuid);
  57. Log.d("trace","tmp plus8: "+tmp.toString());
  58. return tmp;
  59. }
  60. public BluetoothServerSocket socketSDKversion8andLess() throws IOException{
  61. BluetoothServerSocket tmp = null;
  62. tmp =bluetoothAdapter.listenUsingRfcommWithServiceRecord("jeu", Utility.uuid);
  63. Log.d("trace","tmp less8: "+tmp.toString());
  64. return tmp;
  65. }
  66. @Override
  67. public void run() {
  68. BluetoothSocket socket = null;
  69. while (true) {
  70. Log.d("trace","Thread Serveur try accecpt");
  71. try {
  72. socket = mmServerSocket.accept();
  73. open=true;
  74. Log.d("trace","Thread Serveur en attente");
  75. } catch (IOException e) {
  76. Log.d("trace","Erreur thread serveur"+e.getMessage());
  77. break;
  78. }
  79. if (socket != null) {
  80. Log.d("trace","Thread Serveur connection etablie");
  81. manageConnectedSocket(socket);
  82. try {
  83. mmServerSocket.close();
  84. } catch (IOException e) {
  85. Log.d("trace","Erreur thread serveur"+e.getMessage());
  86. e.printStackTrace();
  87. }
  88. break;
  89. }
  90. }
  91. }
  92. private void manageConnectedSocket(BluetoothSocket socket) {
  93. //3. get Input and Output streams
  94. try {
  95. mmOutStream = new ObjectOutputStream(socket.getOutputStream());
  96. mmOutStream.flush();
  97. mmInStream = new ObjectInputStream(socket.getInputStream());
  98. } catch (IOException e1) {
  99. Log.d("trace",e1.getMessage());
  100. }
  101. Log.d("trace","SERVEUR CONNECTE !!");
  102. //4. The two parts communicate via the input and output streams
  103. while(open){
  104. sentShoot=false;
  105. try{
  106. //**************************************************
  107. // WAITING FOR DETECTION
  108. Log.d("trace","serveur waiting message");
  109. message = (String)mmInStream.readObject();
  110. Log.d("trace","MESSAGE RECU SERVEUR : "+message);
  111. //user add to view
  112. if(message.equals("detection")){
  113. Message msg = new Message();
  114. msg.obj=message;
  115. msg.what=0;
  116. handler.sendMessage(msg);
  117. //**************************************************
  118. // STOP AND RESTART
  119. //Send to the client a server object witch is serializable via the OutputStream
  120. sendMessage(server);
  121. msg = new Message();
  122. msg.what=1;
  123. handler.sendMessage(msg);
  124. }
  125. else{
  126. if(message.equals("startGame")){
  127. Message msg = new Message();
  128. msg.obj=message;
  129. msg.what=2;
  130. handler.sendMessage(msg);
  131. playing=true;
  132. }
  133. }
  134. }
  135. catch(ClassNotFoundException classnot){
  136. Log.d("trace","Data received in unknown format");
  137. open=false;
  138. playing=false;
  139. } catch (OptionalDataException e) {
  140. Log.d("trace","error serveur????"+e.getMessage());
  141. open=false;
  142. playing=false;
  143. } catch (IOException e) {
  144. Log.d("trace","error serveur??"+e.getMessage());
  145. open=false;
  146. playing=false;
  147. }
  148. while(playing&&open){
  149. sentShoot=false;
  150. Log.d("trace","SERVER THREAD WHILE PLAYING");
  151. //1 get a random number
  152. //2 send it to the client
  153. // sleep then vibrate
  154. //while
  155. //wait for serverUser to shoot OR a shoot from the client
  156. //random to send a signal to make both devices vibrating
  157. int random = getRandomInt();
  158. //**************************************************
  159. //Send the random value to the client
  160. sendMessage(String.valueOf(random));
  161. //sleep the random time
  162. try {
  163. sleep(random*1000);
  164. } catch (InterruptedException e) {
  165. Log.d("trace","SERVER thread SLEEP FAIL");
  166. playing=false;
  167. }
  168. //send value to GameClientActivity because
  169. //Vibrate code must be called with a reference to a Context
  170. Message msg2 = new Message();
  171. msg2.obj="nothing";
  172. msg2.what=3;
  173. handler.sendMessage(msg2);
  174. waitingShoot=true;
  175. //WAIT SHOT from him self AND from the client
  176. while(waitingShoot){
  177. //did the client shooted me ?
  178. try{
  179. Log.d("trace","SERVER WAITING FOR SHOT");
  180. clientShoot = (Disparo)mmInStream.readObject();
  181. Log.d("trace","SHOT RECEIVED");
  182. //***************
  183. Message msg = new Message();
  184. msg.what=6;
  185. if(clientShoot.getUser().equals("fake")){
  186. //I receive a fake shot to start next round and i won
  187. msg.obj="fake";
  188. }
  189. else{
  190. //I receive a shot from real user, so i lost and i make death sound
  191. msg.obj="lose";
  192. }
  193. handler.sendMessage(msg);
  194. //***************
  195. waitingShoot=false;
  196. }
  197. catch(ClassNotFoundException classnot){
  198. Log.d("trace","555t");waitingShoot=false;open=false;
  199. } catch (OptionalDataException e) {
  200. Log.d("trace","666");waitingShoot=false;open=false;
  201. } catch (IOException e) {
  202. Log.d("trace","777");
  203. waitingShoot=false;open=false;
  204. }
  205. //after shoot and being shooted redo
  206. }//end while waitingShoot
  207. //TODO : here you have been shoot then you send a fake shoot to play the next round
  208. if(!sentShoot){
  209. Message msg = new Message();
  210. msg.obj="nothing";
  211. msg.what=4;
  212. handler.sendMessage(msg);
  213. //WAITING FOR USER TO PRESS NEXT ROUND
  214. synchronized(this) {
  215. try {
  216. wait();
  217. } catch(InterruptedException e) {
  218. throw new RuntimeException(e);
  219. }
  220. }
  221. //********************************
  222. Disparo disp = new Disparo("fake", 0, 0,0, 0, null);
  223. sendMessage(disp);
  224. }
  225. else{
  226. Log.d("trace","SERVER SHOT SENT");
  227. }
  228. }//end while playing
  229. }//end while open
  230. }
  231. public void setSentShoot(boolean sentShoot) {
  232. this.sentShoot = sentShoot;
  233. }
  234. private int getRandomInt() {
  235. int lower = 1;
  236. int higher = 5;
  237. return ((int)(Math.random() * (higher+1-lower)) + lower);
  238. }
  239. public void sendMessage(String msg)
  240. //http://docs.oracle.com/javase/tutorial/essential/io/objectstreams.html
  241. {
  242. try{
  243. mmOutStream.writeObject(msg);
  244. mmOutStream.flush();
  245. Log.d("trace","server envois >" + msg);
  246. }
  247. catch(IOException ioException){
  248. Log.d("trace","ERROR SEND MESSAGE"+ioException.getMessage());
  249. }
  250. }
  251. public void sendMessage(Object obj){
  252. //http://developer.android.com/reference/java/io/ObjectOutputStream.html#write(byte[], int, int)
  253. try{
  254. mmOutStream.writeObject(obj);
  255. mmOutStream.flush();
  256. Log.d("trace","client envois : "+obj.toString());
  257. }
  258. catch(IOException ioException){
  259. Log.d("trace","client ERROR SEND MESSAGE>"+ioException.getMessage());
  260. }
  261. }
  262. public void cancel() {
  263. open=false;
  264. try {
  265. mmServerSocket.close();
  266. mmInStream.close();
  267. mmOutStream.close();
  268. Log.d("trace","CLOSE Serveur");
  269. } catch (IOException e) {
  270. Log.d("trace","CLOSE ERROR"+e.getMessage());
  271. }
  272. }
  273. public void stopServeur(View v){
  274. try{
  275. Log.d("trace","stop serveur");
  276. this.cancel();
  277. }
  278. catch (Exception e){Log.d("trace","stop serveur CATCH"+e.getMessage());}
  279. }
  280. public void stopServeur(){
  281. try{
  282. Log.d("trace","stop serveur");
  283. this.cancel();
  284. }
  285. catch (Exception e){Log.d("trace","stop serveur CATCH"+e.getMessage());}
  286. }
  287. public void setHandler(Handler handler) {
  288. this.handler=handler;
  289. }
  290. }
  291. //******************* FIN SERVEUR *********************