国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android使用Socket通信實現多人聊天應用

2019-10-22 18:13:25
字體:
來源:轉載
供稿:網友

使用Socket實現多人聊天應用,供大家參考,具體內容如下

 android,Socket,多人聊天

在講scoket通信器先可以先了解一下網絡協議

手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。可以將網絡協議分為四層,從高到低依次為:應用層、傳輸層、網絡層、鏈路層。

兩種Socket類型的基本通信

TCP是一個可靠的、面向連接的協議。它可以保證數據從連接的一方傳遞到另一方,并且發送數據的順序和所接收數據的順序一致。當應用程序需要一個可靠的、點對點的連接時,可以使用TCP。

android,Socket,多人聊天

UDP是一種不可靠的通信協議,沒有檢測錯誤的機制,也不重發丟失的數據。接收到的數據包的順序可能與發送的數據包的順序不一致。采用UDP進行通信時,事先不需要建立連接。而采用TCP進行通信時,首先要建立一個連接。TCP的通信質量比UDP高,UDP的開銷比TCP小。

 android,Socket,多人聊天

這里我們以TCP協議為主

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

Socket套接字概念

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

先看一下TCP通信的步驟:

建立Socket連接

• 連接過程分為三個步驟:

–服務端監聽

–客戶端請求

–連接確認

(多線程機制,各個客戶端和服務器之間的通信)

–服務端:ServerSocket

–客戶端:Socket

–信息傳輸:

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

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

案例:

使用TCP協議通信

 java服務端,此時是使用java做服務端

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>();// 創建一個集合存放所有的客戶端   /**   * @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();// 使服務端處于監聽狀態     clients.add(s);    // 為每一個客戶端開設一個單個線程    new ChatThread(s).start();     // OutputStream os=client.getOutputStream();    // os.write("Nice to meet you!".getBytes("utf-8"));    // os.close();//網絡編程流的關閉是按棧的方式關閉的    // 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;    // 獲取客戶端傳遞過來的數據    try {     while ((content = br.readLine()) != null) {      // 再將服務端的數據返回給客戶端      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);// 網絡訪問最好放在線程中      new chatThread(client).start();// 啟動子線程     } 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"));// 獲取從客戶端得到的數據    } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   } //setence.setText("");//相當于刷新  }   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();    }   }   } } 

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 方城县| 巴里| 西贡区| 阳高县| 宾阳县| 白朗县| 怀集县| 南川市| 营口市| 永川市| 沅陵县| 河间市| 类乌齐县| 游戏| 乌拉特中旗| 淅川县| 颍上县| 台安县| 绥化市| 石河子市| 宽甸| 河源市| 无极县| 宜良县| 临澧县| 南投县| 奉节县| 拉萨市| 丹东市| 镇赉县| 洞头县| 青州市| 射洪县| 鹰潭市| 平舆县| 张北县| 白山市| 河间市| 乌兰县| 都匀市| 金塔县|