p2p 技術(shù),可以讓具備相應硬件的 Android 4.0(API 級別 14) 或更高版本設(shè)備在沒有中間接入點的情況下,通過 wlan 進行直接互聯(lián)。使用這些 api ,您可以實現(xiàn)支持 wlan p2p 的設(shè)備間相互發(fā)現(xiàn)和連接,從而獲得比藍牙連接更遠距離的高速連接通信效果。對于多人游戲或照片共享等需要在用戶之間共享數(shù)據(jù)的應用而言,這一技術(shù)非常有用。
做網(wǎng)站、網(wǎng)站建設(shè)的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗。創(chuàng)新互聯(lián)建站多年互聯(lián)網(wǎng)經(jīng)驗,見的多,溝通容易、能幫助客戶提出的運營建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇創(chuàng)新互聯(lián)建站,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價值服務(wù)。
一個設(shè)備上可以有多個 p2p 服務(wù)存在,通過 addLocalService 可以在設(shè)備上發(fā)布自己的 p2p 服務(wù),通過 removeLocalService 可以移除自己的 p2p 服務(wù)
serviceName 是服務(wù)的名字,可以自定義,這里設(shè)置為 DON_TEST
serviceType 是服務(wù)類型,格式為 _protocol._transportlayer ,表示協(xié)議+傳輸類型。
例如:
p2p 設(shè)備信息及連接狀態(tài)的變化,需要通過監(jiān)聽系統(tǒng)廣播來實現(xiàn),常用到的廣播有以下幾個:
通過方法 discoverPeers 可搜索設(shè)備周圍的p2p設(shè)備
discoverPeers 會觸發(fā)廣播 WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION ,收到此廣播后,通過方法 requestPeers 可獲取周邊 p2p 設(shè)備列表
通過 一、服務(wù)發(fā)布 ,發(fā)布了一個名為 DON_TEST 的服務(wù),通過 discoverServices 方法就可以搜索到這個服務(wù),同時需要通過 setDnsSdResponseListeners 方法設(shè)置監(jiān)聽 WifiP2pManager.DnsSdServiceResponseListener 和 WifiP2pManager.DnsSdTxtRecordListener ,在搜索過程中這兩個監(jiān)聽會回調(diào)搜索到的服務(wù)信息。
WifiP2pManager.DnsSdServiceResponseListener 用于監(jiān)聽搜索到的服務(wù)信息
WifiP2pManager.DnsSdTxtRecordListener 用于獲取服務(wù)發(fā)布攜帶的額外信息,例如 一、服務(wù)發(fā)布 中的攜帶的信息 port 8888
通過 WifiP2pManager.DnsSdServiceResponseListener 可以搜索到可用的服務(wù)信息,通過方法 onDnsSdServiceAvailable 中的參數(shù) WifiP2pDevice 可獲取到服務(wù)所在的設(shè)備信息,通過 connect 方法可以連接該設(shè)備
connect 調(diào)用成功之后,如果是首次連接,對端手機會顯示一個彈窗,用戶選擇允許連接之后,兩部手機手機才能建立連接。
建立連接之后,系統(tǒng)會發(fā)送廣播 WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION ,收到這個廣播之后,可通過 requestConnectionInfo 方法獲取連接信息 WifiP2pInfo ,通過 WifiP2pInfo 可獲取對方的 ip
連接到了一起,此時系統(tǒng)會自動創(chuàng)建一個群組 (Group) 并隨機指定一臺設(shè)備為群主 (GroupOwner) 。此時,對于兩臺設(shè)備來說,群主的 IP 地址是可知的(系統(tǒng)回調(diào)函數(shù)中有提供),但客戶端的 IP 地址需要再來通過其他方法來主動獲取。
可以通過創(chuàng)建群組,指定某臺設(shè)備作為服務(wù)器端(群主),即指定某臺設(shè)備用來接收文件,因此,服務(wù)器端要主動創(chuàng)建群組,并等待客戶端的連接。
server端
客戶端
在兩部手機通過 p2p 連接之后,客戶端傳輸文件到服務(wù)端
參考:
等答案!
Android4.0開始只是Wifip2p了,可以利用這個來做一個P2P聊天。
為了使用Wi-Fi P2P,要在你的清單文件中添加 CHANGE_WIFI_STATE 、 ACCESS_WIFI_STATE 、和 INTERNET 權(quán)限。即使Wi-FiP2P不要求互聯(lián)網(wǎng)連接,但它要使用標準的Java套接字,并且Android在使用這些套接字時要求申請這些權(quán)限,因此要在清單中申請INTERNET權(quán)限。
manifestxmlns:android="http //schemas android com/apk/res/android" package="com.example.android.nsdchat"
...
uses-permission
android:required="true"
android:name="android.permission.ACCESS_WIFI_STATE"/
uses-permission
android:required="true"
android:name="android.permission.CHANGE_WIFI_STATE"/
uses-permission
android:required="true"
android:name="android.permission.INTERNET"/
...
添加本地服務(wù)
如果你要提供一個本地服務(wù),那么就需要把這個服務(wù)注冊為可發(fā)現(xiàn)的。本地服務(wù)被注冊后,框架就會自動的響應來自對等點的服務(wù)發(fā)現(xiàn)請求。
以下是創(chuàng)建本地服務(wù)的步驟:
1. 創(chuàng)建一個 WifiP2pServiceInfo 對象;
2. 填入你的服務(wù)相關(guān)的信息;
3. 調(diào)用addLocalService()方法來注冊本地服務(wù),讓其可發(fā)現(xiàn)。
private void startRegistration () { // Create a string map containing information about your service.
Map record = new HashMap();
record.put("listenport", String.valueOf(SERVER_PORT));
record.put("buddyname", "John Doe" + (int) (Math.random() * 1000));
record.put("available", "visible");
// Serviceinformation. Pass it an instance name, service type
//_protocol._transportlayer , and the map containing
//information other devices will want once they connect to this one.
WifiP2pDnsSdServiceInfo serviceInfo =
WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record);
// Add thelocal service, sending the service info, network channel,
// andlistener that will be used to indicate success or failure of
// therequest.
mManager.addLocalService(channel, serviceInfo, new ActionListener() {
@Override
public void onSuccess() {
// Command successful! Code isn't necessarily needed here,
// Unless you want to update the UI or add logging statements.
}
@Override
public void onFailure(int arg0) {
// Command failed. Check for P2P_UNSUPPORTED, ERROR, or BUSY
}
});
}
發(fā)現(xiàn)附近的服務(wù)
Android使用回調(diào)方法來通知你的應用程序可用的服務(wù),因此首先要做的就是要建立回調(diào)方法。創(chuàng)建一個 WifiP2pManager.DnsSdTxtRecordListener 對象來監(jiān)聽傳入的記錄。這個記錄可以是其他設(shè)備的任意廣播。當一個記錄進入時,你可以把設(shè)備地址和其他你想要的其他相關(guān)信息復制到當前方法外部的數(shù)據(jù)結(jié)構(gòu)中,以便后續(xù)可以訪問它。下面的例子假設(shè)記錄中包含一個“buddyname”字段,它帶有用戶的標識。
final HashMap String , String buddies = new HashMap String , String (); ...
private void discoverService() {
DnsSdTxtRecordListener txtListener = new DnsSdTxtRecordListener() {
@Override
/* Callbackincludes:
* fullDomain: full domainname: e.g "printer._ipp._tcp.local."
* record: TXT record dta as amap of key/value pairs.
* device: The device runningthe advertised service.
*/
public voidonDnsSdTxtRecordAvailable(
String fullDomain, Map record, WifiP2pDevice device) {
Log.d(TAG, "DnsSdTxtRecord available -" + record.toString());
buddies.put(device.deviceAddress, record.get("buddyname"));
}
};
...
}
實現(xiàn)一個 WifiP2pManager.DnsSdServiceResponseListener 接口,來獲取服務(wù)信息。這個接口會接收實際的描述和連接信息。上面的代碼中使用了 Map 對象把設(shè)備地址和用戶標識組成一對。服務(wù)響應監(jiān)聽器使用這個接口把DNS記錄和對應的服務(wù)信息連接到一起。實現(xiàn)上述兩個監(jiān)聽器后,使用 setDnsSdResponseListener() 方法把它們添加給 WifiP2pManager 對象。
private void discoverService () { ...
DnsSdServiceResponseListener servListener = new DnsSdServiceResponseListener() {
@Override
public voidonDnsSdServiceAvailable(String instanceName, String registrationType,
WifiP2pDevice resourceType) {
// Update the device name with the human-friendly version from
// the DnsTxtRecord, assuming one arrived.
resourceType.deviceName = buddies
.containsKey(resourceType.deviceAddress) ? buddies
.get(resourceType.deviceAddress) : resourceType.deviceName;
// Add to the custom adapter defined specifically for showing
// wifi devices.
WiFiDirectServicesList fragment = (WiFiDirectServicesList)getFragmentManager()
.findFragmentById(R.id.frag_peerlist);
WiFiDevicesAdapter adapter = ((WiFiDevicesAdapter)fragment
.getListAdapter());
adapter.add(resourceType);
adapter.notifyDataSetChanged();
Log.d(TAG, "onBonjourServiceAvailable " + instanceName);
}
};
mManager.setDnsSdResponseListeners(channel, servListener, txtListener);
...
}
現(xiàn)在創(chuàng)建一個服務(wù)請求并調(diào)用 addServiceRequest() 方法,這個方法也需要一個監(jiān)聽器來包括成功或失敗。
serviceRequest = WifiP2pDnsSdServiceRequest . newInstance (); mManager .addServiceRequest(channel,
serviceRequest,
new ActionListener() {
@Override
public void onSuccess() {
// Success!
}
@Override
public void onFailure(int code) {
// Command failed. Check forP2P_UNSUPPORTED, ERROR, or BUSY
}
});
最后,調(diào)用的 discoverServices() 方法。
mManager . discoverServices ( channel , new ActionListener () { @Override
public void onSuccess() {
// Success!
}
@Override
public void onFailure(int code) {
// Command failed. Check for P2P_UNSUPPORTED, ERROR, or BUSY
if (code == WifiP2pManager.P2P_UNSUPPORTED) {
Log.d(TAG, "P2P isn'tsupported on this device.");
else if(...)
...
}
});
如果一切順利,恭喜你大功告成。如果遇到問題,記住前面異步調(diào)用的參數(shù) WifiP2pManager.ActionListener 參數(shù),它提供了指示成功或失敗的回調(diào)方法。把調(diào)試斷點設(shè)置在 onFailure() 方法中來診斷問題。這個方法提供了錯誤代碼,以下是可能發(fā)生的錯誤:
P2P_UNSUPPORTED
運行 app 的設(shè)備上不支持 Wi-Fi P2P
BUSY
系統(tǒng)忙于處理請求
ERROR
由于內(nèi)部錯誤導致操作失敗
p2p可能不能實現(xiàn)實時播放。因為p2p是分段傳輸?shù)?,有可能你傳輸了尾部的一段視頻,前面的視頻段還沒穿,造成播放卡頓。
要是實時傳輸,還是兩臺電腦之間通過udp協(xié)議直接傳的好。
或者給p2p加上限制,視頻段必須按順序傳播。
說實話我不太看得懂你的意思。
如果你說的是獲取別人手機上的視頻并邊下載邊播放的話,那么udp協(xié)議傳輸文件即可。
如果你說的是獲取別人正在錄制的視頻并播放的話,那么有點類似視頻通話,兩個端口同步傳輸圖像和文件,還是用udp協(xié)議。
所以我不知道你為什么要糾結(jié)于p2p?
1、注冊用戶((Openfire服務(wù)器),已搭建好服務(wù)器。
2、好友添加(不用分組,在聊天界面直接顯示添加的好友)
3、P2P聊天(文字功能)
4、保存查看聊天記錄:用戶可查看與好友的聊天記錄信息
5、好友上下線自動刷新各自頭像列表,點擊頭像進入聊天界面
6、demo要支持android手機、7寸平板和10平板.
一、下載并安裝p2p種子搜索器。
安卓版下載地址:
IOS版下載地址:
二、安裝后開始使用本軟件。
1、進入主界面即可看到“軟件”項目里包含百度云、手機迅雷、迅雷影音等常用云點播工具。
2、進入搜索界面,搜索后,即可顯示文件大小、格式信息。
3、選擇搜索到的種子進入詳情頁面,“拷貝”選項支持將鏈接地址拷貝到剪貼板;“播放”選項支持云點播
4、點擊云播放即顯示下面的示意圖,歡迎體驗。