Android開發socket通訊——手機做server端C/S架構實現

來源:互聯網
上載者:User

標籤: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架構實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.