欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android使用Socket通信實(shí)現(xiàn)多人聊天應(yīng)用

 更新時(shí)間:2018年03月30日 14:56:53   作者:其實(shí)我叫孟小賢  
這篇文章主要為大家詳細(xì)介紹了android使用Socket通信實(shí)現(xiàn)多人聊天應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

使用Socket實(shí)現(xiàn)多人聊天應(yīng)用,供大家參考,具體內(nèi)容如下

 

在講scoket通信器先可以先了解一下網(wǎng)絡(luò)協(xié)議

手機(jī)能夠使用聯(lián)網(wǎng)功能是因?yàn)槭謾C(jī)底層實(shí)現(xiàn)了TCP/IP協(xié)議,可以使手機(jī)終端通過無線網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)之上。可以將網(wǎng)絡(luò)協(xié)議分為四層,從高到低依次為:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層。

兩種Socket類型的基本通信

TCP是一個(gè)可靠的、面向連接的協(xié)議。它可以保證數(shù)據(jù)從連接的一方傳遞到另一方,并且發(fā)送數(shù)據(jù)的順序和所接收數(shù)據(jù)的順序一致。當(dāng)應(yīng)用程序需要一個(gè)可靠的、點(diǎn)對點(diǎn)的連接時(shí),可以使用TCP。

UDP是一種不可靠的通信協(xié)議,沒有檢測錯(cuò)誤的機(jī)制,也不重發(fā)丟失的數(shù)據(jù)。接收到的數(shù)據(jù)包的順序可能與發(fā)送的數(shù)據(jù)包的順序不一致。采用UDP進(jìn)行通信時(shí),事先不需要建立連接。而采用TCP進(jìn)行通信時(shí),首先要建立一個(gè)連接。TCP的通信質(zhì)量比UDP高,UDP的開銷比TCP小。

 

這里我們以TCP協(xié)議為主

其實(shí)android與服務(wù)器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在于,http連接使用的是“請求—響應(yīng)方式”,即在請求時(shí)建立連接通道,當(dāng)客戶端向服務(wù)器發(fā)送請求后,服務(wù)器端才能向客戶端返回?cái)?shù)據(jù)。而Socket通信則是在雙方建立起連接后就可以直接進(jìn)行數(shù)據(jù)的傳輸,在連接時(shí)可實(shí)現(xiàn)信息的主動(dòng)推送,而不需要每次由客戶端想服務(wù)器發(fā)送請求。 那么,什么是socket?Socket又稱套接字,在程序內(nèi)部提供了與外界通信的端口,即端口通信。通過建立socket連接,可為通信雙方的數(shù)據(jù)傳輸傳提供通道。socket的主要特點(diǎn)有數(shù)據(jù)丟失率低,使用簡單且易于移植。

Socket套接字概念

 套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。

先看一下TCP通信的步驟:

建立Socket連接

• 連接過程分為三個(gè)步驟:

–服務(wù)端監(jiān)聽

–客戶端請求

–連接確認(rèn)

(多線程機(jī)制,各個(gè)客戶端和服務(wù)器之間的通信)

–服務(wù)端:ServerSocket

–客戶端:Socket

–信息傳輸:

• 發(fā)送信息getoutputsream()   write();

• 接收信息getinputstream()    read(); 

案例:

使用TCP協(xié)議通信

 java服務(wù)端,此時(shí)是使用java做服務(wù)端

ScoketDemo .java

package scoket.activity; 
 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 
 
public class ScoketDemo { 
 public static List<Socket> clients = new ArrayList<Socket>();// 創(chuàng)建一個(gè)集合存放所有的客戶端 
 
 /** 
  * @param args 
  * @throws IOException 
  */ 
 public static void main(String[] args) throws IOException { 
  // TODO Auto-generated method stub 
  ServerSocket ss; 
  while (true) { 
   ss = new ServerSocket(2019); 
   Socket s = ss.accept();// 使服務(wù)端處于監(jiān)聽狀態(tài) 
 
   clients.add(s); 
   // 為每一個(gè)客戶端開設(shè)一個(gè)單個(gè)線程 
   new ChatThread(s).start(); 
 
   // OutputStream os=client.getOutputStream(); 
   // os.write("Nice to meet you!".getBytes("utf-8")); 
   // os.close();//網(wǎng)絡(luò)編程流的關(guān)閉是按棧的方式關(guān)閉的 
   // client.close(); 
  } 
  // No enclosing instance of type ScoketDemo is accessible. Must qualify 
  // the allocation 
  // with an enclosing instance of type 
  // ScoketDemo (e.g. x.new A() where x is an instance of ScoketDemo). 
 } 
 
 public static class ChatThread extends Thread { 
 
  Socket client; 
  BufferedReader br; 
 
  public ChatThread(Socket c) { 
   super(); 
   this.client = c; 
 
   try { 
    br = new BufferedReader(new InputStreamReader( 
      client.getInputStream(), "UTF-8"));// 將客戶端對象封裝一下 
   } catch (UnsupportedEncodingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
 
  } 
 
  @Override 
  public void run() { 
   // TODO Auto-generated method stub 
   super.run(); 
   String content = null; 
   // 獲取客戶端傳遞過來的數(shù)據(jù) 
   try { 
    while ((content = br.readLine()) != null) { 
     // 再將服務(wù)端的數(shù)據(jù)返回給客戶端 
     OutputStream os = client.getOutputStream(); 
     os.write(content.getBytes("utf-8")); 
    } 
   } catch (UnsupportedEncodingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } 
 
 } 
} 

android客戶端

ChatScoketDemoActivity.java

package com.scoket.activity; 
 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.UnknownHostException; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
 
public class ChatScoketDemoActivity extends Activity implements OnClickListener { 
 /** Called when the activity is first created. */ 
 private EditText name, setence, show; 
 private Button btn; 
 Socket client; 
 Handler myHandler = new Handler() { 
  public void handleMessage(android.os.Message msg) { 
   if (msg.what==123) { 
    String str = show.getText().toString(); 
    show.setText(str +"\n"+ msg.getData().getString("chat")); 
   } 
    
  }; 
 }; 
 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  btn = (Button) findViewById(R.id.button1); 
  name = (EditText) findViewById(R.id.name); 
  setence = (EditText) findViewById(R.id.setence); 
  show = (EditText) findViewById(R.id.show); 
 
  btn.setOnClickListener(this); 
  new Thread(new Runnable() { 
 
   @Override 
   public void run() { 
    // TODO Auto-generated method stub 
    try { 
     client = new Socket("172.20.52.26", 2019);// 網(wǎng)絡(luò)訪問最好放在線程中 
     new chatThread(client).start();// 啟動(dòng)子線程 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
   } 
  }).start(); 
   
 } 
 
 @Override 
 public void onClick(View arg0) { 
  // TODO Auto-generated method stub 
  String s1 = name.getText().toString(); 
  String s2 = setence.getText().toString(); 
  String s3 = s1 + ":" + s2+"\n"; 
  if (client != null) { 
   try { 
    client.getOutputStream().write(s3.getBytes("utf-8"));// 獲取從客戶端得到的數(shù)據(jù) 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } //setence.setText("");//相當(dāng)于刷新 
 } 
 
 class chatThread extends Thread { 
  Socket s; 
 
  public chatThread(Socket s) { 
   super(); 
   this.s = s; 
  } 
 
  @Override 
  public void run() { 
 
   try { 
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    while (true) { 
     String content = br.readLine(); 
     if (content != null) { 
      Bundle bundle = new Bundle(); 
      bundle.putString("chat", content); 
      Message msg = new Message(); 
      msg.setData(bundle); 
      msg.what=123; 
      myHandler.sendMessage(msg); 
     } 
 
    } 
   } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
   } 
  } 
 
 } 
} 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Android studio 3.6.1 出現(xiàn)Cause: unable to find valid certification path to requested target 報(bào)錯(cuò)的問題

    解決Android studio 3.6.1 出現(xiàn)Cause: unable to find valid certifi

    這篇文章主要介紹了Android studio 3.6.1 出現(xiàn)Cause: unable to find valid certification path to requested target 報(bào)錯(cuò)的問題及解決方法,需要的朋友可以參考下
    2020-03-03
  • Android自定義選項(xiàng)卡切換效果

    Android自定義選項(xiàng)卡切換效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android 錄音與播放功能的簡單實(shí)例

    Android 錄音與播放功能的簡單實(shí)例

    這篇文章主要介紹了 Android 錄音與播放功能的簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android實(shí)現(xiàn)局部模糊效果

    Android實(shí)現(xiàn)局部模糊效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)局部模糊效果,幫助大家實(shí)現(xiàn)模糊或者毛玻璃效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • android 支持的語言列表(匯總)

    android 支持的語言列表(匯總)

    本篇文章是對android支持的語言進(jìn)行了部分匯總,需要的朋友參考下
    2013-06-06
  • 刷新Activity中的scrollview示例(局部ui刷新)

    刷新Activity中的scrollview示例(局部ui刷新)

    代碼很簡單,但是很實(shí)用,適合在一個(gè)Activity中要刷新局部的UI,比如在掃描一維碼的時(shí)候,要把每次掃描的結(jié)果都顯示在界面上
    2014-01-01
  • Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解

    Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解

    本篇文章主要介紹了Android RecyclerView 復(fù)用錯(cuò)亂通用解法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Adnroid打造通用的帶進(jìn)度條的WebView

    Adnroid打造通用的帶進(jìn)度條的WebView

    這篇文章主要為大家詳細(xì)介紹了Adnroid打造通用的帶進(jìn)度條的WebView的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView的Adapter使用 之 初學(xué)ArrayAdapter String

    ListView是Android中經(jīng)常會使用的東西,綁定數(shù)據(jù)對于初學(xué)者來說,尤其是剛接觸編程的人來說,往往會覺得很難理解,我上大二的時(shí)候?qū)W的java,但是基本上相當(dāng)于沒有學(xué),什么都沒寫過,真正接觸編程就是開始上手學(xué)android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解
    2013-06-06
  • Android 實(shí)現(xiàn)圓角圖片的簡單實(shí)例

    Android 實(shí)現(xiàn)圓角圖片的簡單實(shí)例

    這篇文章主要介紹了Android 實(shí)現(xiàn)圓角圖片的簡單實(shí)例的相關(guān)資料,Android 圓角圖片的實(shí)現(xiàn)形式,包括用第三方、也有系統(tǒng),需要的朋友可以參考下
    2017-07-07

最新評論