使用Socket實(shí)現(xiàn)多人聊天應(yīng)用,供大家參考,具體內(nèi)容如下
為忻城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及忻城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、做網(wǎng)站、忻城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
在講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é)議可以對(duì)上層網(wǎng)絡(luò)提供接口,使上層網(wǎng)絡(luò)數(shù)據(jù)的傳輸建立在“無差別”的網(wǎng)絡(luò)之上??梢詫⒕W(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。
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連接使用的是“請(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)部提供了與外界通信的端口,即端口通信。通過建立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)聽
–客戶端請(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 Listclients = new ArrayList ();// 創(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"));// 將客戶端對(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; // 獲取客戶端傳遞過來的數(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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。