溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-09-13 14:55:03 來(lái)源:腳本之家 閱讀:351 作者:其實(shí)我叫孟小賢 欄目:移動(dòng)開(kāi)發(fā)

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

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

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

手機(jī)能夠使用聯(lián)網(wǎng)功能是因?yàn)槭謾C(jī)底層實(shí)現(xiàn)了TCP/IP協(xié)議,可以使手機(jī)終端通過(guò)無(wú)線網(wǎng)絡(luò)建立TCP連接。TCP協(xié)議可以對(duì)上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無(wú)差別”的網(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)對(duì)點(diǎn)的連接時(shí),可以使用TCP。

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

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)銷比TCP小。

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

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

其實(shí)android與服務(wù)器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在于,http連接使用的是“請(qǐng)求—響應(yīng)方式”,即在請(qǐng)求時(shí)建立連接通道,當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求后,服務(wù)器端才能向客戶端返回?cái)?shù)據(jù)。而Socket通信則是在雙方建立起連接后就可以直接進(jìn)行數(shù)據(jù)的傳輸,在連接時(shí)可實(shí)現(xiàn)信息的主動(dòng)推送,而不需要每次由客戶端想服務(wù)器發(fā)送請(qǐng)求。 那么,什么是socket?Socket又稱套接字,在程序內(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)

–客戶端請(qǐng)求

–連接確認(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īng)狀態(tài) 
 
   clients.add(s); 
   // 為每一個(gè)客戶端開(kāi)設(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"));// 將客戶端對(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; 
   // 獲取客戶端傳遞過(guò)來(lái)的數(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ò)訪問(wèn)最好放在線程中 
     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(); 
   } 
  } 
 
 } 
} 

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI