android使用Socket通信實現(xiàn)多人聊天應用
使用Socket實現(xiàn)多人聊天應用,供大家參考,具體內容如下

在講scoket通信器先可以先了解一下網(wǎng)絡協(xié)議
手機能夠使用聯(lián)網(wǎng)功能是因為手機底層實現(xiàn)了TCP/IP協(xié)議,可以使手機終端通過無線網(wǎng)絡建立TCP連接。TCP協(xié)議可以對上層網(wǎng)絡提供接口,使上層網(wǎng)絡數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡之上??梢詫⒕W(wǎng)絡協(xié)議分為四層,從高到低依次為:應用層、傳輸層、網(wǎng)絡層、鏈路層。
兩種Socket類型的基本通信
TCP是一個可靠的、面向連接的協(xié)議。它可以保證數(shù)據(jù)從連接的一方傳遞到另一方,并且發(fā)送數(shù)據(jù)的順序和所接收數(shù)據(jù)的順序一致。當應用程序需要一個可靠的、點對點的連接時,可以使用TCP。

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

這里我們以TCP協(xié)議為主
其實android與服務器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在于,http連接使用的是“請求—響應方式”,即在請求時建立連接通道,當客戶端向服務器發(fā)送請求后,服務器端才能向客戶端返回數(shù)據(jù)。而Socket通信則是在雙方建立起連接后就可以直接進行數(shù)據(jù)的傳輸,在連接時可實現(xiàn)信息的主動推送,而不需要每次由客戶端想服務器發(fā)送請求。 那么,什么是socket?Socket又稱套接字,在程序內部提供了與外界通信的端口,即端口通信。通過建立socket連接,可為通信雙方的數(shù)據(jù)傳輸傳提供通道。socket的主要特點有數(shù)據(jù)丟失率低,使用簡單且易于移植。
Socket套接字概念
套接字(socket)是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元。它是網(wǎng)絡通信過程中端點的抽象表示,包含進行網(wǎng)絡通信必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地進程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。
先看一下TCP通信的步驟:
建立Socket連接
• 連接過程分為三個步驟:
–服務端監(jiān)聽
–客戶端請求
–連接確認
(多線程機制,各個客戶端和服務器之間的通信)
–服務端:ServerSocket
–客戶端:Socket
–信息傳輸:
• 發(fā)送信息getoutputsream() write();
• 接收信息getinputstream() read();
案例:
使用TCP協(xié)議通信
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>();// 創(chuàng)建一個集合存放所有的客戶端
/**
* @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();// 使服務端處于監(jiān)聽狀態(tài)
clients.add(s);
// 為每一個客戶端開設一個單個線程
new ChatThread(s).start();
// OutputStream os=client.getOutputStream();
// os.write("Nice to meet you!".getBytes("utf-8"));
// os.close();//網(wǎng)絡編程流的關閉是按棧的方式關閉的
// 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) {
// 再將服務端的數(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)絡訪問最好放在線程中
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"));// 獲取從客戶端得到的數(shù)據(jù)
} 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();
}
}
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android Socket實現(xiàn)多個客戶端聊天布局
- Android Socket通信實現(xiàn)簡單聊天室
- Android使用Websocket實現(xiàn)聊天室
- 基于Socket.IO實現(xiàn)Android聊天功能代碼示例
- android Socket實現(xiàn)簡單聊天小程序
- android socket聊天室功能實現(xiàn)
- android Socket實現(xiàn)簡單聊天功能以及文件傳輸
- Android 基于Socket的聊天室實例
- Android基于socket實現(xiàn)的簡單C/S聊天通信功能
- Android Socket實現(xiàn)多個客戶端即時通信聊天
相關文章
解決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 報錯的問題及解決方法,需要的朋友可以參考下2020-03-03
刷新Activity中的scrollview示例(局部ui刷新)
代碼很簡單,但是很實用,適合在一個Activity中要刷新局部的UI,比如在掃描一維碼的時候,要把每次掃描的結果都顯示在界面上2014-01-01
Android RecyclerView 復用錯亂通用解法詳解
本篇文章主要介紹了Android RecyclerView 復用錯亂通用解法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
ListView的Adapter使用 之 初學ArrayAdapter String
ListView是Android中經(jīng)常會使用的東西,綁定數(shù)據(jù)對于初學者來說,尤其是剛接觸編程的人來說,往往會覺得很難理解,我上大二的時候學的java,但是基本上相當于沒有學,什么都沒寫過,真正接觸編程就是開始上手學android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解2013-06-06

