導航:首頁 > 操作系統 > androidsocket廣播

androidsocket廣播

發布時間:2022-06-20 04:54:36

android客戶端作為伺服器區域網用Socket,在一個activity中監聽埠。其他activity發送數據。如何實現呢

1 最簡單也是最笨的辦法是啟動要發送數據的Activity,然後在這個Activtiy進行發送數據。
2 如果你不能接受這樣的話,發送廣播通知那個Activity發送數據。
3 另外,個人覺得,在後台發送數據的功能還是不要寫在Activity的好,可以用service或者線程來實現。
4 如果你決定了用某種方法,咱們在進一步討論

Ⅱ android怎麼寫socket一對一聊天彈出界面

1 用一個EditText作為用戶名輸入口,用一個按鍵確定。

2 注冊一個廣播接收器,專門接收由後來的聊天界面發過來的消息廣播(包括發信人,收信人,消息體)。

3 創建一個客戶端連接服務端的方法(要在線程中啟動該方法),連接成功並獲取輸入輸出流以後,再在裡面啟動一個輸入流管理線程(接受並處理由服務端發送過來的消息)。並通過intent啟動下一個好友列表界面(同時把自身用戶名發給下一界面)。

4 對於輸入流管理線程,要先判斷接收到的是好友名單還是聊天消息發送兩種廣播,(服務端發送兩種信息時可以加個標簽以便線程區分)。然後分發出兩種廣播,一種廣播後面的好友列表界面接受的在線好友名單,另一種廣播出聊天界面接收的聊天信息。

5 在菜單下做一個退出Activity按鍵,方便用戶退出程序。

6 當一切准備好以後,用戶在輸入用戶名並點擊確定,就可以實現以上操作,同時進入了好友列表界面(前提是能正確連接上服務端)。二 好友列表界面

1 注冊一個廣播接收器,專門接收由登錄界面的輸入流管理線程發送過來的好友名單廣播

2 用listView逐個顯示好友名單。

3 獲取用戶登錄界面發過來的自身用戶名。

4 給listView綁定一個監聽器,當用戶點擊listView上的某一好友時,通過intent啟動下一個聊天界面,並把所點擊到的好友用戶名以及自身用戶名發給下一個界面。

三 聊天界面

1 獲取好友列表界面發送過來的聊天好友用戶名以及自身用戶名,並在Title上顯示。

2 用一個EditText作為聊天消息輸入口,用一個按鍵確定輸出。

3 當用戶點擊確定以後,發送一個消息廣播(包含發信人,收信人,消息體),讓用戶登錄界面的消息廣播接收器接收。

4 注冊一個廣播接收器接受用戶登錄界面的輸入流管理線程發送過來的消息。

服務端設計思路:

消息處理界面(只有一個界面)

1 創建一個監聽連接請求方法 (監聽客戶端發送連接請求,需要在線程中啟動)。

A 當用戶發送連接請求時,生成socket對象。由該socket對象生成輸出流和輸入流,從輸入流中提取出客戶端發送過來的用戶名,把用戶名放到sickName數組上,把輸出流放在ArrayOut數組中。

B 發送新客戶端XXX連接成功廣播。

C 預先用sickName數組和ArrayOut數組創建發送好友列表方法(給各已連接客戶端發送好友名單),在這里調用方法。

D 新生成並啟動輸入流管理線程(接受並處理客戶端發送過來的消息,由於有一個新用戶生成,就新生一個輸入流管理線程,所以客戶端發送的消息不會混亂)。

2 創建發送好友列表方法。

3 注冊兩個廣播接收器,一個接收新客戶端XXX連接成功廣播;另一個接收輸入流管理線程發送過來的聊天消息,識別出目標對象,並向目標對象分別發送消息。

4 在onResume方法中啟動監聽線程。

5 在菜單下做一個退出Activity按鍵和刷新按鈕(再次發送已連接用戶名單給各客戶端)。

Ⅲ socket 的廣播地址怎麼用

針對255.255.255.255這個地址,實際上是個受限的廣播地址,在操作系統上,一般用應用層上的UDP發送,是發不出這個地址的。你可以容易發送一個針對指向網路的廣播:192.168.1.255。而實際上,我們也基本用不到4個255地址的廣播報文。像ARP、DHCP這樣的廣播報文,是系統自身的特殊協議數據包。所以不用在應用層上試圖發送4個255的受限報文。
在一些單片機上,可以直接在發送的原始數據包中填寫4個255的地址。
你用抓包軟體可以看到這些數據包,但是在應用層上,你基本上收不到這些報文。

Ⅳ android如何與手機進行通信(Socket連接)

其實跟電腦差不多了,android里調用socket的方法,拿到socket後就可以發送數據並接收數據。

我最近正在做android方面的通信,真的想把完整的代碼都給你,可是沒辦法,公司機密。。

給你我的socket連接類吧。。。

package sean.socket;

///////////把MyType的一些方法替換成Writer的方法
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import sean.Sysout;
import sean.business.BusinessCenter;
import sean.business.LoginManager;
import sean.format.MyType;
import sean.io.Reader;
import sean.transfer.BytesBuffer;
import sean.transfer.DataCenter;

public class SocketThread implements Runnable {

String Server = "";
int Port = 0;
static Socket cs = null;
// Thread ioThread=null;
static boolean bool_SocketThread = false;
static OutputStream output = null;

public SocketThread(String server, int port) {
Server = server;
Port = port;
bool_SocketThread = true;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (bool_SocketThread) {
try {
// if (cs == null) {
DataCenter.setBool_Login(false);// 設置登錄失敗
Sysout.println("正在嘗試連接ClientSocket...", Sysout.TempOutDebug);
cs = new Socket(InetAddress.getByName(Server), Port);
if (cs != null) {
Sysout.println("ClientSocket連接成功!__" + cs,
Sysout.TempOutDebug);
cs.setKeepAlive(true);//讓socket保持活動狀態

InputStream input = cs.getInputStream();
output = cs.getOutputStream();
BusinessCenter.sendLoginData();

BytesBuffer bBuffer = new BytesBuffer();
byte[] Buffer = new byte[1024];
int ReadBytes = input.read(Buffer);
while (ReadBytes != -1) {
Sysout.println("已讀取" + ReadBytes + "個位元組到緩沖區",
Sysout.TempOutDebug);
byte[] b = new byte[ReadBytes];
b = MyType.BytesInsertToBytes(Buffer, b, 0);
Reader r = new Reader(b);
Sysout.println(r.toString() + "____ReadBytes=="
+ ReadBytes, Sysout.TempOutDebug);
bBuffer.InsertToBuffer(Buffer, ReadBytes);
ReadBytes = input.read(Buffer);
}
} else {
Sysout.printException("ClientSocket連接失敗!請確認網路正常且伺服器已開啟。");
}
// }
// 執行到這里說明inputstream.read()已中斷,說明socket已斷開連接
// cs=null;
LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
DataCenter.setBool_Login(false);// 數據中心登錄注銷
Sysout.printException(cs + "已斷開。");
Thread.sleep(2 * 1000);// 睡眠2秒後繼續循環

// try {
// // 判斷ClientSocket是否已斷開
// cs.sendUrgentData(0);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// Sysout.printException("ClientSocket已斷開,重新連接。"+e);
// cs.close();
// cs = null;
// }
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====解析伺服器名稱發生異常!" + e);
// e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread發生IO異常,異常消息:" + e);
try {
if (cs != null) {
Sysout.println("准備關閉" + cs, Sysout.TempOutDebug);
cs.shutdownOutput();
cs.shutdownInput();
cs.close();
cs = null;
output = null;
LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
DataCenter.setBool_Login(false);// 數據中心登錄注銷
Sysout.println(cs + "已關閉。", Sysout.TempOutDebug);
}
try {
Thread.sleep(5000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====線程睡眠異常!!"
+ e2);
// e2.printStackTrace();
}
String ExceptionInfos=e.toString();
if(ExceptionInfos.endsWith("Connection refused")){
stopSocketThread();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
Sysout.printException(cs + "關閉發生異常::" + e1);
// e1.printStackTrace();
try {
Thread.sleep(5000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====線程睡眠異常!!"
+ e2);
// e2.printStackTrace();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}// while(bool_SocketThread)
Sysout.println("SocketThread已停止。", Sysout.TempOutDebug);
}

public static Socket getSocket() {
return cs;
}

// public void setBool(boolean bool0) {
// bool_SocketThread = bool0;
// }

public static OutputStream getOutputStream() {
return output;
}

public static void stopSocketThread() {
try {
// 停止SocketThread線程,必須先把循環的標志bool_SocketThread置為false,否則可能繼續循環,重新建立socket連接
bool_SocketThread = false;
// 關閉socket
if (cs != null) {
cs.shutdownOutput();
cs.shutdownInput();
cs.close();
cs = null;
output = null;

Sysout.println("ClientSocket已被強制關閉。");
// LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
// DataCenter.setBool_Login(false);// 數據中心登錄注銷
// byte[] lock=LoginActivity.getLock();
// synchronized(lock){
// lock.notify();
// }
}
} catch (IOException e) {
// TODO Auto-generated catch block
Sysout.printException("強制關閉" + cs + "發生異常::" + e);
// e.printStackTrace();
}
}

}

必須先在android里啟動一個服務,由服務去啟動這個socket線程,因為如果是UI去啟動的話,頁面會卡住。。。

Ⅳ 關於socket廣播,請問下面的程序什麼意思啊,大家能幫幫忙么。詳細點啊~~

同學,你給的這段程序從哪裡來的,有問題,雖然可能可以運行。
我註解了一下,你看看好使不:

//發送端程序

#include <stdio.h>
#include <winsock.h>

int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息結構的指針
SOCKET sockListener;
SOCKADDR_IN sin,saUdpServ;
BOOL fBroadcast = TRUE;
char sendBuff[1024];
int nSize;
int ncount=0;
// 初始化winsock庫,使用socket的前提
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//進行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失敗返回-1
return -1;
}
// 創建socket
sockListener=socket(PF_INET,SOCK_DGRAM,0);
// 打開廣播選項,是socket可以廣播消息
setsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast,sizeof ( BOOL ));
// 將socket綁定到本地埠
sin.sin_family = AF_INET;
sin.sin_port = htons(0);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失敗返回-1
return -1;
}
// 設定廣播的目的埠
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (7001);//發送用的埠,可以根據需要更改
nSize = sizeof ( SOCKADDR_IN );
while(1)
{
// 廣播消息
sprintf(sendBuff,"Message %d",ncount++);
sendto ( sockListener,sendBuff,
lstrlen (sendBuff),
0,
(SOCKADDR *) &saUdpServ,
sizeof ( SOCKADDR_IN ));
printf("%s\n",sendBuff);
}
return 0;
}

//接收

#include <stdio.h>
#include <winsock.h>
#include <conio.h>

int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息結構的指針
SOCKET sockListener;
SOCKADDR_IN sin,saClient;
char cRecvBuff[1024];
int nSize,nbSize;
int iAddrLen=sizeof(saClient);
if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0)//進行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop.\n");//初始化失敗返回-1
return -1;
}
// 綁定到7001埠,以監聽來自網路的數據
sockListener=socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(7001);//發送端使用的發送埠,可以根據需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");//初始化失敗返回-1
return -1;
}
while(1)
{
nSize = sizeof ( SOCKADDR_IN );
// 接受消息
if((nbSize=recvfrom (sockListener,cRecvBuff,1024,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR)
{
printf("Recive Error");
break;
}
cRecvBuff[nbSize] = '\0';
printf("%s\n",cRecvBuff);

}
return 0;
}

Ⅵ 如何用socket發送廣播幀

這是一個發送多播幀的例子:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

#define SERV_PORT 5000

int main(int,char**)
{
int SendtoSocket;
sockaddr_in SendtoAddr;
int AddrLen=sizeof(SendtoAddr);
char szBuffer[200]="This is a test\n";
char *szTime;
SendtoSocket=socket(AF_INET,SOCK_DGRAM,0);
bzero(&SendtoAddr,sizeof(SendtoAddr));
SendtoAddr.sin_family=AF_INET;
SendtoAddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,"224.0.3.1",&SendtoAddr.sin_addr);
const int on=1;
// setsockopt(SendtoSocket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
time_t CurrentTime;
for(;;)
{
time(&CurrentTime);
szTime=ctime(&CurrentTime);
sendto(SendtoSocket,szTime,strlen(szTime),0,(sockaddr *)&SendtoAddr,AddrLe
n);
sleep(1);
}
}
這是接收多播幀的例子:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <string.h>
#include <unistd.h>

#define SERV_PORT 5000

int main(int,char**)
{
int RecvSocket;
sockaddr_in ServAddr;
socklen_t AddrLen=sizeof(ServAddr);
char szBuffer[201];
RecvSocket=socket(AF_INET,SOCK_DGRAM,0);
bzero(&ServAddr,sizeof(ServAddr));
ServAddr.sin_family=AF_INET;
ServAddr.sin_addr.s_addr=htonl(INADDR_ANY);
ServAddr.sin_port=htons(SERV_PORT);
bind(RecvSocket,(sockaddr *)&ServAddr,AddrLen);
ip_mreq mreq;
inet_pton(AF_INET,"224.0.3.1",&mreq.imr_multiaddr.s_addr);
mreq.imr_interface.s_addr=ServAddr.sin_addr.s_addr;
setsockopt(RecvSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
int nRecv;
for(;;)
{
nRecv=recvfrom(RecvSocket,szBuffer,200,0,(sockaddr *)&ServAddr,&AddrLen);

szBuffer[nRecv]='\0';
printf(szBuffer);
}
}

Ⅶ 請教如何搜索周邊的android設備,並發送消息

  1. 區域網,例如同一個路由器下,利用socket編程,向255.255.255.255以及指定埠發送廣播,然後所有該區域網內,設置了指定埠監聽的手機應用都可以收到廣播,收到廣播後,就可以獲取到發送廣播的手機的IP地址,然後通過該IP地址向主機監聽的埠發送信息,這樣主機就知道附近有哪些其他的安卓手機了;

  2. 不同的區域網,需要藉助有公網IP地址的伺服器進行轉發,才可以實現,這個叫雲穿透,所有手機連接到網路後要向伺服器注冊,然後伺服器就知道有哪些手機,然後其他手機只要通過伺服器的公網IP提出請求,就可以通過伺服器間接的進行通訊。

Ⅷ nodejs的socket.io的廣播機制是怎樣的

node.js提供了高效的服務端運行環境,但是由於瀏覽器端對HTML5的支持不一,為了兼容所有瀏覽器,提供卓越的實時的用戶體驗,並且為程序員提供客戶端與服務端一致的編程體驗,於是socket.io誕生。
socket.io設計的目標是支持任何的瀏覽器,任何Mobile設備。目前支持主流的PC瀏覽器 (IE,Safari,Chrome,Firefox,Opera等),Mobile瀏覽器(iphone Safari/ipad Safari/android WebKit/WebOS WebKit等)。socket.io基於node.js並簡化了WebSocket API,統一了通信的API。它支持:WebSocket, Flash Socket, AJAX long-polling, AJAX multipart streaming, Forever IFrame, JSONP polling。
socket.io解決了實時的通信問題,並統一了服務端與客戶端的編程方式。啟動了socket以後,就像建立了一條客戶端與服務端的管道,兩邊可以互通有無。

Ⅸ Android 進程間通信的幾種實現方式

Android 進程間通信的幾種實現方式

主要有4種方式:

這4種方式正好對應於android系統中4種應用程序組件:Activity、Content Provider、Broadcast和Service。

主要實現原理:

由於應用程序之間不能共享內存。為了在不同應用程序之間交互數據(跨進程通訊),AndroidSDK中提供了4種用於跨進程通訊的方式進行交互數據,實現進程間通信主要是使用sdk中提供的4組組件根據實際開發情況進行實現數據交互。

詳細實現方式:

Acitivity實現方式

Activity的跨進程訪問與進程內訪問略有不同。雖然它們都需要Intent對象,但跨進程訪問並不需要指定Context對象和Activity的 Class對象,而需要指定的是要訪問的Activity所對應的Action(一個字元串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個參數指定)。 在android系統中有很多應用程序提供了可以跨進程訪問的Activity,例如,下面的代碼可以直接調用撥打電話的Activity。

IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);


Content Provider實現方式

Android應用程序可以使用文件或SqlLite資料庫來存儲數據。Content Provider提供了一種在多個應用程序之間數據共享的方式(跨進程共享數據)

應用程序可以利用Content Provider完成下面的工作

1. 查詢數據
2. 修改數據
3. 添加數據
4. 刪除數據

Broadcast 廣播實現方式

廣播是一種被動跨進程通訊的方式。當某個程序向系統發送廣播時,其他的應用程序只能被動地接收廣播數據。這就象電台進行廣播一樣,聽眾只能被動地收聽,而不能主動與電台進行溝通。在應用程序中發送廣播比較簡單。只需要調用sendBroadcast方法即可。該方法需要一個Intent對象。通過Intent對象可以發送需要廣播的數據。


Service實現方式

常用的使用方式之一:利用AIDL Service實現跨進程通信

這是我個人比較推崇的方式,因為它相比Broadcast而言,雖然實現上稍微麻煩了一點,但是它的優勢就是不會像廣播那樣在手機中的廣播較多時會有明顯的時延,甚至有廣播發送不成功的情況出現。

注意普通的Service並不能實現跨進程操作,實際上普通的Service和它所在的應用處於同一個進程中,而且它也不會專門開一條新的線程,因此如果在普通的Service中實現在耗時的任務,需要新開線程。

要實現跨進程通信,需要藉助AIDL(Android Interface Definition Language)。Android中的跨進程服務其實是採用C/S的架構,因而AIDL的目的就是實現通信介面。


總結

跨進程通訊這個方面service方式的通訊遠遠復雜於其他幾種通訊方式,實際開發中Activity、Content Provider、Broadcast和Service。4種經常用到,學習過程中要對沒種實現方式有一定的了解。

Ⅹ android:udp廣播

首先手機作為終端 可以不必要知道終端的數量、 還有就是我建議你多學習下基礎,android的廣播機制不是把廣播在終端之間傳輸,廣播是在應用程序裡面發送,在應用程序進行接收。個人建議基礎才是王道。 對於你現在這個問題,不妨採用發送消息的方式 實現該功能。一個終端發送消息 其他終端接收消息,當然也相當於寫一個socket通信。通信建立之後 ,可以取得各個連接的終端的IP 然後怎麼邏輯就看你怎麼寫演算法了。還有就是,這個功能也可以用消息推送的方式(建議採用此方法)、android系統內置有消息推送,邏輯都和上述的差不多,至於具體用那些方法 那些內置類,個人建議多查API。軟體開發必須靠自學。。。。

閱讀全文

與androidsocket廣播相關的資料

熱點內容
24v電動駐車空調壓縮機 瀏覽:840
老程序員編程步驟 瀏覽:303
物理去除加密軟體 瀏覽:225
匯編語言可調試編譯器 瀏覽:447
jpeg如何轉成pdf 瀏覽:841
微機室為什麼有伺服器 瀏覽:657
安卓手機怎麼打語音電話不斷網 瀏覽:458
單片機匯編頭文件 瀏覽:946
juniper命令行 瀏覽:68
程序員咨詢銷售工作怎麼樣 瀏覽:782
蘋果文件伺服器是什麼 瀏覽:180
企業透明加密軟體有監視功能嗎 瀏覽:494
桌面的運行命令 瀏覽:10
主流廠商伺服器維護流程是什麼 瀏覽:807
壓縮棉的被子先洗洗在用 瀏覽:242
批處理bat代碼和文件夾 瀏覽:298
怎麼交叉編譯tslib14 瀏覽:494
致程序員生產力飆升 瀏覽:762
程序員害怕下班嗎 瀏覽:108
鐵路漢宜線加密網實景效果圖 瀏覽:929