亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android通過Socket與服務器之間進行通信的示例

2019-10-21 21:31:36
字體:
來源:轉載
供稿:網友

一、首先進行Server的編寫:

public class SocketServer { private static Socket mSocket; public static void main(String[] argc) {  try {   //1.創建一個服務器端Socket,即ServerSocket,指定綁定的端口,并監聽此端口   ServerSocket serverSocket = new ServerSocket(12345);   InetAddress address = InetAddress.getLocalHost();   String ip = address.getHostAddress();   //2.調用accept()等待客戶端連接   System.out.println("~~~服務端已就緒,等待客戶端接入~,服務端ip地址: " + ip);   mSocket = serverSocket.accept();   //3.連接后獲取輸入流,讀取客戶端信息   InputStream is = null;   InputStreamReader isr = null;   BufferedReader br = null;   OutputStream os = null;   is = mSocket.getInputStream();   isr = new InputStreamReader(is, "UTF-8");   br = new BufferedReader(isr);   String info = null;   while ((info = br.readLine()) != null) {    System.out.println("客戶端發送過來的信息" + info);    if (info.equals(BackService.HEART_BEAT_STRING)) {     sendmsg("ok");    } else {     sendmsg("服務器發送過來的信息" + info);    }   }   mSocket.shutdownInput();   mSocket.close();  } catch (IOException e) {   e.printStackTrace();  }} //為連接上服務端的每個客戶端發送信息 public static void sendmsg(String msg) {  PrintWriter pout = null;  try {   pout = new PrintWriter(new BufferedWriter(    new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);   pout.println(msg);  } catch (IOException e) {   e.printStackTrace();  } }}

二、對客戶端的編寫,主要用用AIDL進行Server和Client

AIDL 的編寫主要為以下三部分:

1、創建 AIDL

1)、創建要操作的實體類,實現 Parcelable 接口,以便序列化/反序列化
2)、新建 aidl 文件夾,在其中創建接口 aidl 文件以及實體類的映射 aidl 文件
3)、Make project ,生成 Binder 的 Java 文件

2、服務端

1)、創建 Service,在其中創建上面生成的 Binder 對象實例,實現接口定義的方法
2)、在 onBind() 中返回

3、客戶端

1)、實現 ServiceConnection 接口,在其中拿到 AIDL 類
2)、bindService()
3)、調用 AIDL 類中定義好的操作請求

IBackService.aidl 文件

package com.example.dell.aidlservice;// Declare any non-default types here with import statementsinterface IBackService { /**  * Demonstrates some basic types that you can use as parameters  * and return values in AIDL.  */ boolean sendMessage(String message);}

Service的編寫,命名為BackService

public class BackService extends Service { private static final String TAG = "danxx"; public static final String HEART_BEAT_STRING = "HeartBeat";//心跳包內容 /**  * 心跳頻率  */ private static final long HEART_BEAT_RATE = 3 * 1000; /**  * 服務器ip地址  */ public static final String HOST = "172.16.50.115"; /**  * 服務器端口號  */ public static final int PORT = 12345; /**  * 服務器消息回復廣播  */ public static final String MESSAGE_ACTION = "message_ACTION"; /**  * 服務器心跳回復廣播  */ public static final String HEART_BEAT_ACTION = "heart_beat_ACTION"; /**  * 讀線程  */ private ReadThread mReadThread; private LocalBroadcastManager mLocalBroadcastManager; /***/ private WeakReference<Socket> mSocket; // For heart Beat private Handler mHandler = new Handler(); /**  * 心跳任務,不斷重復調用自己  */ private Runnable heartBeatRunnable = new Runnable() {  @Override  public void run() {   if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {    boolean isSuccess = sendMsg(HEART_BEAT_STRING);//就發送一個/r/n過去 如果發送失敗,就重新初始化一個socket    if (!isSuccess) {     mHandler.removeCallbacks(heartBeatRunnable);     mReadThread.release();     releaseLastSocket(mSocket);     new InitSocketThread().start();    }   }   mHandler.postDelayed(this, HEART_BEAT_RATE);  } }; private long sendTime = 0L; /**  * aidl通訊回調  */ private IBackService.Stub iBackService = new IBackService.Stub() {  /**   * 收到內容發送消息   * @param message 需要發送到服務器的消息   * @return   * @throws RemoteException   */  @Override  public boolean sendMessage(String message) throws RemoteException {   return sendMsg(message);  } }; @Override public IBinder onBind(Intent arg0) {  return iBackService; } @Override public void onCreate() {  super.onCreate();  new InitSocketThread().start();  mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); } public boolean sendMsg(final String msg) {  if (null == mSocket || null == mSocket.get()) {   return false;  }  final Socket soc = mSocket.get();  if (!soc.isClosed() && !soc.isOutputShutdown()) {   new Thread(new Runnable() {    @Override    public void run() {     try {      OutputStream os = soc.getOutputStream();      String message = msg + "/r/n";      os.write(message.getBytes());      os.flush();     } catch (IOException e) {      e.printStackTrace();     }    }   }).start();   sendTime = System.currentTimeMillis();//每次發送成數據,就改一下最后成功發送的時間,節省心跳間隔時間  } else {   return false;  }  return true; } private void initSocket() {//初始化Socket  try {   //1.創建客戶端Socket,指定服務器地址和端口   Socket so = new Socket(HOST, PORT);   mSocket = new WeakReference<Socket>(so);   mReadThread = new ReadThread(so);   mReadThread.start();   mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//初始化成功后,就準備發送心跳包  } catch (UnknownHostException e) {   e.printStackTrace();  } catch (IOException e) {   e.printStackTrace();  } } /**  * 心跳機制判斷出socket已經斷開后,就銷毀連接方便重新創建連接  *  * @param mSocket  */ private void releaseLastSocket(WeakReference<Socket> mSocket) {  try {   if (null != mSocket) {    Socket sk = mSocket.get();    if (!sk.isClosed()) {     sk.close();    }    sk = null;    mSocket = null;   }  } catch (IOException e) {   e.printStackTrace();  } } class InitSocketThread extends Thread {  @Override  public void run() {   super.run();   initSocket();  } } // Thread to read content from Socket class ReadThread extends Thread {  private WeakReference<Socket> mWeakSocket;  private boolean isStart = true;  public ReadThread(Socket socket) {   mWeakSocket = new WeakReference<Socket>(socket);  }  public void release() {   isStart = false;   releaseLastSocket(mWeakSocket);  }  @Override  public void run() {   super.run();   Socket socket = mWeakSocket.get();   if (null != socket) {    try {     InputStream is = socket.getInputStream();     byte[] buffer = new byte[1024 * 4];     int length = 0;     while (!socket.isClosed() && !socket.isInputShutdown() && isStart && ((length = is.read(buffer)) != -1)) {      if (length > 0) {       String message = new String(Arrays.copyOf(buffer, length)).trim();       Log.e(TAG, message);       //收到服務器過來的消息,就通過Broadcast發送出去       if (message.equals("ok")) {//處理心跳回復        Intent intent = new Intent(HEART_BEAT_ACTION);        mLocalBroadcastManager.sendBroadcast(intent);       } else {        //其他消息回復        Intent intent = new Intent(MESSAGE_ACTION);        intent.putExtra("message", message);        mLocalBroadcastManager.sendBroadcast(intent);       }      }     }    } catch (IOException e) {     e.printStackTrace();    }   }  } } @Override public void onDestroy() {  super.onDestroy();  mHandler.removeCallbacks(heartBeatRunnable);  mReadThread.release();  releaseLastSocket(mSocket); }}

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView mResultText; private EditText mEditText; private Intent mServiceIntent; private IBackService iBackService; private ServiceConnection conn = new ServiceConnection() {  @Override  public void onServiceDisconnected(ComponentName name) {   iBackService = null;  }  @Override  public void onServiceConnected(ComponentName name, IBinder service) {   iBackService = IBackService.Stub.asInterface(service);  } }; class MessageBackReciver extends BroadcastReceiver {  private WeakReference<TextView> textView;  public MessageBackReciver(TextView tv) {   textView = new WeakReference<TextView>(tv);  }  @Override  public void onReceive(Context context, Intent intent) {   String action = intent.getAction();   TextView tv = textView.get();   if (action.equals(BackService.HEART_BEAT_ACTION)) {    if (null != tv) {     Log.i("danxx", "Get a heart heat");     tv.setText("Get a heart heat");    }   } else {    Log.i("danxx", "Get a heart heat");    String message = intent.getStringExtra("message");    tv.setText("服務器消息:" + message);   }  } } private MessageBackReciver mReciver; private IntentFilter mIntentFilter; private LocalBroadcastManager mLocalBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);  mResultText = (TextView) findViewById(R.id.resule_text);  mEditText = (EditText) findViewById(R.id.content_edit);  findViewById(R.id.send).setOnClickListener(this);  findViewById(R.id.send1).setOnClickListener(this);  mReciver = new MessageBackReciver(mResultText);  mServiceIntent = new Intent(this, BackService.class);  mIntentFilter = new IntentFilter();  mIntentFilter.addAction(BackService.HEART_BEAT_ACTION);  mIntentFilter.addAction(BackService.MESSAGE_ACTION); } @Override protected void onStart() {  super.onStart();  mLocalBroadcastManager.registerReceiver(mReciver, mIntentFilter);  bindService(mServiceIntent, conn, BIND_AUTO_CREATE); } @Override protected void onStop() {  super.onStop();  unbindService(conn);  mLocalBroadcastManager.unregisterReceiver(mReciver); } public void onClick(View view) {  switch (view.getId()) {   case R.id.send:    String content = mEditText.getText().toString();    try {     boolean isSend = iBackService.sendMessage(content);//Send Content by socket     Toast.makeText(this, isSend ? "success" : "fail", Toast.LENGTH_SHORT).show();     mEditText.setText("");    } catch (RemoteException e) {     e.printStackTrace();    }    break;   case R.id.send1:    new Thread(new Runnable() {     @Override     public void run() {      try {       acceptServer();      } catch (IOException e) {       e.printStackTrace();      }     }    }).start();    break;   default:    break;  } } private void acceptServer() throws IOException {  //1.創建客戶端Socket,指定服務器地址和端口  Socket socket = new Socket("172.16.50.115", 12345);  //2.獲取輸出流,向服務器端發送信息  OutputStream os = socket.getOutputStream();  PrintWriter printWriter = new PrintWriter(os); //將輸出流包裝為打印流  //獲取客戶端的IP地址  InetAddress address = InetAddress.getLocalHost();  String ip = address.getHostAddress();  printWriter.write("客戶端:~" + ip + "~ 接入服務器??!");  printWriter.flush();  socket.shutdownInput();  socket.close(); }}

源碼地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品永久免费观看| 国产精品久久久久久久久久东京| 97久久久免费福利网址| 精品在线欧美视频| 国产69精品99久久久久久宅男| 色香阁99久久精品久久久| 国产网站欧美日韩免费精品在线观看| 久久精品一本久久99精品| 亚洲精品综合精品自拍| 一本色道久久综合狠狠躁篇怎么玩| 日韩在线www| 国产精品久久久久久久久久久久| 国产午夜精品视频免费不卡69堂| 国产一区二区三区在线播放免费观看| 国产日韩专区在线| 亚洲高清不卡av| 日本在线精品视频| 久久久久久久999| 一本大道亚洲视频| 国产丝袜一区视频在线观看| 国产精品爱啪在线线免费观看| 国产日韩视频在线观看| 国产精品亚洲视频在线观看| 精品亚洲夜色av98在线观看| 欧美国产日韩二区| 亚洲图片在区色| 国产精品对白刺激| 亚洲精品二三区| 亚洲综合av影视| 91色视频在线观看| 亚洲视频专区在线| 欧美精品xxx| 欧美日韩中文在线观看| 亚洲欧美中文字幕在线一区| 久久精品久久久久| 亚洲综合av影视| 97精品在线观看| 综合网中文字幕| 精品美女久久久久久免费| 国产精品久久久久久久久久免费| 亚洲第一黄色网| 久久精品成人欧美大片| 精品少妇一区二区30p| 欧美激情第一页xxx| 国产精品观看在线亚洲人成网| 日韩视频免费大全中文字幕| 欧美成人精品在线观看| 3344国产精品免费看| 91精品国产自产在线观看永久| 亚洲午夜色婷婷在线| 91网站在线看| 色综合久综合久久综合久鬼88| 久久成人亚洲精品| 欧美老女人www| 国产日韩欧美日韩大片| 国产婷婷成人久久av免费高清| 狠狠综合久久av一区二区小说| 久久久噜噜噜久久久| 夜夜嗨av色一区二区不卡| 久久久免费高清电视剧观看| 欧美性极品xxxx做受| 91大神福利视频在线| 97香蕉久久超级碰碰高清版| 国产日韩亚洲欧美| 久久精品中文字幕电影| 成人写真福利网| 中文字幕日韩欧美在线视频| 在线播放日韩欧美| 久久久久久久久国产精品| 在线观看欧美成人| 久久99国产精品久久久久久久久| 亚洲成人激情在线观看| 国产伦精品免费视频| 亚洲第一精品福利| 成人国内精品久久久久一区| 欧美精品电影免费在线观看| 国产午夜精品免费一区二区三区| 国产精品第七影院| 久久6免费高清热精品| 久久久久中文字幕2018| 亚洲午夜未满十八勿入免费观看全集| 国语对白做受69| 欧美性xxxxx极品娇小| 国产在线一区二区三区| 久久精品一本久久99精品| 久久久久久网站| 欧美成人免费va影院高清| 高潮白浆女日韩av免费看| 欧美日韩中文字幕在线| 欧美xxxx综合视频| 中国日韩欧美久久久久久久久| 亚洲国产成人爱av在线播放| 国产精品自产拍高潮在线观看| 国产91精品高潮白浆喷水| 国产福利成人在线| 欧美成人亚洲成人日韩成人| 成人黄在线观看| 欧美性极品少妇精品网站| 久久久亚洲天堂| 91精品国产高清久久久久久91| 亚洲美女www午夜| 日本欧美精品在线| 91香蕉嫩草神马影院在线观看| 久久亚洲国产精品成人av秋霞| 精品久久久久久久久久ntr影视| 久久精品国产久精国产一老狼| 亚洲xxxxx| 日韩中文在线中文网三级| 色妞一区二区三区| 91天堂在线视频| 色综合久久88色综合天天看泰| 国产精品久久久久久久久免费看| 国产欧美亚洲视频| 秋霞午夜一区二区| 日韩在线观看免费全集电视剧网站| 国产小视频国产精品| 国产精品劲爆视频| 国产乱人伦真实精品视频| 另类色图亚洲色图| 日韩中文视频免费在线观看| 日韩www在线| 久久久国产精品亚洲一区| 欧美黑人又粗大| 法国裸体一区二区| 久久中文精品视频| 4k岛国日韩精品**专区| 日韩欧美中文在线| 亚洲免费av片| 日韩激情在线视频| 亚洲欧美国产视频| 亚洲欧美日韩天堂一区二区| 亚洲午夜精品视频| 日韩精品高清在线| 2019中文字幕免费视频| xxx欧美精品| 欧美日韩免费区域视频在线观看| 在线精品国产欧美| 亚洲欧美一区二区三区情侣bbw| 日本成人精品在线| 日本精品视频在线播放| 日韩一二三在线视频播| 黄色成人在线免费| 亚洲人成在线播放| 久久久久久久国产| 国产日韩欧美在线观看| 国产精品狼人色视频一区| 国产精品视频成人| 欧美日韩免费观看中文| 亚洲视频在线免费观看| 国产精品亚洲自拍| 国产精品视频一区二区三区四| 777午夜精品福利在线观看| 中文字幕精品网| 日韩成人在线网站| 国产一区深夜福利| 欧美二区在线播放| 亚洲性猛交xxxxwww| 欧美与黑人午夜性猛交久久久| 久久精品青青大伊人av| 亚洲黄色av女优在线观看| 亚洲精品一区二区久| 最近日韩中文字幕中文| 欧美性感美女h网站在线观看免费| 欧美日韩亚洲天堂|