最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ī)終端通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對(duì)上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無(wú)差別”的網(wǎng)絡(luò)之上??梢詫⒕W(wǎng)絡(luò)協(xié)議分為四層,從高到低依次為:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層。

兩種Socket類(lèi)型的基本通信

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

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

 

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

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

Socket套接字概念

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

先看一下TCP通信的步驟:

建立Socket連接

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

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

–客戶(hù)端請(qǐng)求

–連接確認(rèn)

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

–服務(wù)端:ServerSocket

–客戶(hù)端: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è)集合存放所有的客戶(hù)端 
 
 /** 
  * @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īng)狀態(tài) 
 
   clients.add(s); 
   // 為每一個(gè)客戶(hù)端開(kāi)設(shè)一個(gè)單個(gè)線(xiàn)程 
   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"));// 將客戶(hù)端對(duì)象封裝一下 
   } 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; 
   // 獲取客戶(hù)端傳遞過(guò)來(lái)的數(shù)據(jù) 
   try { 
    while ((content = br.readLine()) != null) { 
     // 再將服務(wù)端的數(shù)據(jù)返回給客戶(hù)端 
     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客戶(hù)端

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ò)訪(fǎng)問(wèn)最好放在線(xiàn)程中 
     new chatThread(client).start();// 啟動(dòng)子線(xiàn)程 
    } 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"));// 獲取從客戶(hù)端得到的數(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(); 
   } 
  } 
 
 } 
} 

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

相關(guān)文章

最新評(píng)論

葫芦岛市| 绿春县| 米泉市| 久治县| 宾阳县| 吉首市| 镇平县| 永春县| 普兰店市| 彭州市| 天全县| 民县| 庆元县| 榕江县| 民勤县| 文山县| 关岭| 平和县| 工布江达县| 闻喜县| 兴国县| 平塘县| 孟村| 寿宁县| 施秉县| 剑河县| 陕西省| 寿阳县| 白山市| 如东县| 台安县| 桓仁| 湟源县| 蒙阴县| 诏安县| 新平| 台南市| 长治县| 琼结县| 永德县| 龙海市|