標籤:android開發 socket server
每一部智能手機都是一部微型電腦,在學校裡最喜歡的就是找上十個八個同學一起區域網路內開幾局dota,突然想到,拿手機C一個遊戲來玩怎樣,不用連wifi、不用開資料,幾部手機選一個做主機,其他手機連上它的熱點,便可以互動起來遊戲搞起來了,多開心~~
實際實現過程中發現拿手機本身做server的手段還真是很少有人使用,網上也很少有現成的解決方案,經過一番摸索,簡單實現了手機自身做server(可兼做用戶端)的socket通訊功能,寫出來請大家指導一下,也是簡單梳理一下方便日後複用。
遇到的最大問題可能是server端socket的阻塞問題,因為我們需要server端一直有socket處於監聽狀態,這樣才能保證可以不斷接受用戶端的串連請求以及用戶端發送的訊息,進而廣播給所有用戶端機器。因此我們不能將serversocket放在MainActivity中,因為會阻塞app的運行,所以可以建立一個service,在service中定義serversocket的操作,在MainActivity中定義一個button,通過button啟動service來開啟server端。我的service代碼如下:
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.IBinder;import android.os.Message;public class ServerSocketService extends Service{private static ArrayList<Socket> socketList = new ArrayList<Socket>();private ServerSocket serverSocket = null;@Overridepublic IBinder onBind(Intent intent){return null;}@Overridepublic void onCreate(){super.onCreate();}@Overridepublic void onDestroy(){super.onDestroy();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){try{new Thread(new ServerThread()).start();}catch(Exception e){e.printStackTrace();}return START_STICKY;}public class ServerThread implements Runnable{private Socket socket = null;public ServerThread(){}public void run(){try{serverSocket = new ServerSocket(4567);while(true){socket = serverSocket.accept();socketList.add(socket);new Thread(new HandleInputMessageThread(socket)).start();}}catch(IOException e){e.printStackTrace();}}}public class HandleInputMessageThread implements Runnable{private Socket socket = null;public HandleInputMessageThread(Socket sock){this.socket = sock;}public void run(){while(true){InputStream inputStream = null;try{inputStream = socket.getInputStream();byte data[] = new byte[1024*4];int i = 0;while((i = inputStream.read(data))!=-1){String buffer = null;buffer = new String(data,"gbk");buffer = buffer.trim() + "\n";OutputStream outputStream = null;for(Socket sock : socketList){outputStream = sock.getOutputStream();outputStream.write(buffer.getBytes("gbk"));outputStream.flush();}break;}}catch(IOException e){e.printStackTrace();}}}}}用戶端的實現就比較簡單,用戶端代碼實現串連服務端功能以及發送訊息資料等功能即可,此處不再貼出。
希望能對有需要的人有所協助~路很長,慢慢飛
Android開發socket通訊——手機做server端C/S架構實現