導航:首頁 > 操作系統 > androidtcp伺服器

androidtcp伺服器

發布時間:2022-07-31 10:09:42

『壹』 請問開發android的朋友,怎麼樣在tcp socket中建立長連接,好像只能在線程里建立連接,線程關閉了就斷了。

後台開啟一個線程一直運行,每隔1分鍾左右發送一個心跳報文給伺服器,以確保時刻跟伺服器鏈接。若超過3次伺服器未對客戶端發送的心跳報文做出回應則重新鏈接。 如果這么作的話,必須確保和伺服器達成一定的應用層協議。

『貳』 Android中TCP客戶端怎麼可以及時判斷與服務端的異常斷開呀 我想在客戶

直接用BufferedReader
如果readLine() 返回為null的話, 表示socket已經斷開連接了, 因為readLine() 是阻塞的, 就是等伺服器的數據輸出, 一直等到返回了回車換行, 才會繼續執行。

『叄』 Tcp,android客戶端服務端斷開重連應該怎麼個實現

我正好也在做這方面的東西,我們可以交流一下,我這邊需要做的是TCP客戶端和TCP伺服器,無這邊伺服器搭建目前運行狀況良好,但是客戶端始終不行,請問你有沒有客戶端的相關常式,我這邊的常式也可以分享給你的說,大家相互借鑒,共同進步。

周末加了一天班,終於把問題解決了,總結一個血的教訓給你,就是:你在調試單片機客戶端的時候,作為伺服器的電腦防火牆一定要關掉啊,我就是因為這樣,白忙了兩天。

你要實現客戶端斷開不影響HTTP伺服器的運行,就需要建立兩個不同的TCP_SERVER_pcb和TCP_CLI ENT_pcb結構體,分別用於客戶端和伺服器的TCP/IP協議棧控制。並且需要兩個不同的發送和接收緩存,不然是不行的。

『肆』 android socket用TCP方式client端怎麼監聽伺服器發送來的數據

伺服器端就是需要一個循環不停的接收,這樣才能保證伺服器能一直監聽客戶端傳過來的數據
你這是同步的,如果用非同步socket的話,BeginReceive裡面注冊了一個回調函數,在回調裡面再次調用BeginReceive就可以一直監聽了

『伍』 關於Android tcp連接

安卓的主線程中是不能用耗時性的操作讀寫,所以,把SOCKET讀寫操作都要放到線程中。
可以用即時線程的辦法。參考我的SOCKET客戶端。

//--------Socket服務端----------------------
void dispClients()
{ //顯示所有客戶
int n=vector.size();
String ss="\n"+n+" clients:\n";
for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
ss+=""+ip+","+port+"\n";
}
textView1.setText(ss);
}
void writeSocket(Socket sk,String s)
{ // 向客戶端Socket發字元串
DataOutputStream outf;
try
{
outf=new DataOutputStream(sk.getOutputStream());
if (!sk.isClosed())
outf.writeUTF(s);
}
catch(Exception e)
{
try
{
setTitle("err");
sk.close(); // 對方已關閉
}
catch(Exception e1)
{
}
}
}
void writeSock(final Socket sk,final String s)
{ // 子線程中向客戶端Socket發字元串
new Thread(new Runnable()
{
@Override
publicvoid run()
{
writeSocket(sk,s);
}
}).start();
}
void sendAll(final String s)
{ // 向所有管理中的客戶Socket發串
boolean del=false;
for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
if (sk.isClosed())
{
vector.remove(i); // 已斷開的連接
del=true;
}
else
writeSock(sk,s);
}
if (del)
{ // 客戶端有變化,通知主程序刷新顯示
Message msg=sHandler.obtainMessage(0,"");
sHandler.sendMessage(msg);
}
}

void readSocket(Socket sk)
{ // 服務端讀Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{ // 讀到字元串後,通知主程序處理
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
s=ip+","+port+":"+s+"\n";
Message msg=sHandler.obtainMessage(1,s);
sHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{
}
}
void readSock(final Socket sk)
{ // 子線程中讀
new Thread(new Runnable()
{
@Override
publicvoid run()
{
readSocket(sk);
}
}).start();
}

void listen(ServerSocket ssk) // 接受多個客戶端連接請求
{
while (!ssk.isClosed())
try
{
Socket sk=ssk.accept();
vector.add(sk); // 有客戶連接
readSock(sk);
// 通知刷新客戶列表
Message msg=sHandler.obtainMessage(0,"");
sHandler.sendMessage(msg);
}
catch(Exception e)
{
}
}
void listen() // 線程接受多個客戶端連接請求
{
new Thread(new Runnable()
{
@Override
publicvoid run()
{
listen(serverSocket);
}
}).start();
}

//---------Socket客戶端----------------------------------
cHandler=new Handler()
{ // 客戶端消息處理器
@Override
public void handleMessage(Message msg)
{
String s=msg.obj.toString();
textView2.append(s);
}
};
clientRead("127.0.0.1",9003);
// clientRead("10.0.2.15",9003);

textView2=(TextView)findViewById(R.id.textView2);
textView2.setText("");
editText1=(EditText)findViewById(R.id.editText1);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s=editText1.getText().toString();
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});
button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
clientSocket.close();
String s="中華人民共和國";
Message msg=sHandler.obtainMessage(1,s);
sHandler.sendMessage(msg);
}
catch(Exception e)
{
}
} //public
});

}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{ // 按返回鍵的退出處理
if (keyCode == KeyEvent.KEYCODE_BACK )
{
try
{ // 防止出現埠已綁定的錯誤
serverSocket.close();
finish();
System.exit(0);
}
catch(Exception e)
{
}
}
return(false);
}

『陸』 我怎樣才能連接與亞行至Android通過TCP

手動處理 從您的設備,如果它是植根 根據對XDA開發後,您可以啟用adb通過WiFi從裝置su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

並且您可以禁用它,並返回亞行與監聽USBsetprop service.adb.tcp.port -1
stop adbd
start adbd

從電腦,如果你有USB連接已經 這是更容易切換無線網路,如果你已經有了USB訪問。從該行已在設備通過USB介面,連接問題adb tcpip 5555
adb connect 192.168.0.101:5555

一定要更換192.168.0.101與實際分配給您的設備的IP地址。 告訴亞行後台程序返回到監聽通過USBadb usb

應用自動化進程 也有在谷歌播放的自動執行此過程的幾個應用程序 CodeGo.net,快速搜索建議adbWireless,支持WiFiadb和adb的WiFi。所有這些都需要root許可權,但adbWireless需要更少的許可權。
2. 這是非常簡單的。 首先確保你的手機是植根。 從市場上下載一個終端模擬器(有很多是free的)。 請確保您的Android連接到您的無線網路,並獲得無線IP地址。 打開終端程序並鍵入:su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

現在去(假設你視窗)在桌面上創建一個快捷方式為「cmd.exe的」(不含引號)。 右鍵單擊CMD快捷方式並選擇"Run as Administrator"改變你的android-sdk-windows\tools folder類型:adb connect ***wifi.ip.address***:5555
(example: adb connect 192.168.0.105:5555)

亞行現在應該說你已連接。 注意:如果你太快給它可能會失敗。所以,如果你說這是行不通的嘗試至少2 5秒鍾的時間間隔。
3. 我知道這是舊的,但我想補充我的2美分- 我需要得到兩個USB和TCPIP工作的adb(不要問),所以我做了以下(使用方向其他人張貼的XDA開發) 運用adb shell:su
#set the port number for adbd
setprop service.adb.tcp.port 5555
#run the adbd daemon *again* instead of doing stop/start, so there
#are 2 instances of adbd running.
adbd &
#set the port back to USB, so the next time adb is started it's
#on USB again.
setprop service.adb.tcp.port -1
exit

4. 正如布賴恩說: 根據對XDA開發後,您可以啟用adb通過WiFi從裝置 對應setProp service.adb.tcp.port 5555 停止adbd 啟動adbd 並且您可以禁用它,並返回亞行與監聽USB 對應setProp service.adb.tcp.port-1 停止adbd 啟動adbd 如果你有USB連接已經,它是更容易切換無線網路。從該行已在設備通過USB介面,連接問題 亞行TCPIP 5555 ADB連接192.168.0.101:5555 告訴亞行後台程序返回到監聽通過USB 也有在Android Market上的幾個應用程序能自動完成這些過程。 它works.You只需要訪問Android shell,然後輸入 另外一個(容易)解決方案是目前市場上:adbWireless,它會自動設置您的手機。 根是必須的!為...
5. 從adb --helpconnect <host>:<port> - connect to a device via TCP/IP

順便說那行選項。 你應該嘗試將手機連接到你的無線網路,然後得到它的IP從您的路由器,它不會工作,對 埠是5554
6. 您保存的adb路徑到您的Windows路徑 在Android激活調試模式 連接到PC 提示(有管理員右)類型:adb的TCPIP 5555 斷開平板電腦,或從電腦智能手機 提示符下鍵入:ADB連接IPADDRESS(IP地址為您的平板電腦或智能手機的DHCP / IP地址,您可以通過無線網路找到->電流 現在,提示你應該看到類似的結果:連接到xxx.xxx.xxx.xxx:5555
7.adb tcpip 5555

奇怪,但是這只是工作,如果我有USB電纜連接,然後我就可以拔掉,並為它去與一切ADB。 而返回時,adb usb

只會工作連接。 沒關系,如果我發出setprop service.adb.tcp.port 5555

或setprop service.adb.tcp.port -1

然後停止和啟動adbd,我仍然需要電纜或這是行不通的。 所以,如果我的亞行不工作,我敢打賭,我將無法使亞行通過WiFi兩種。
8. 你可以ssh本地埠轉發。但它仍然涉及電纜。 您的USB連接(主機)與一個sshd運行。 在遠程(遊客)個人電腦開始能夠portforwarding /隧道的ssh客戶端端。 例如:砰砰-L 5037:本地主機:5037 這種結構給我的設備連接到虛擬機。 到是不夠穩定(在調試過程中) SSH隧道工程為自由和更可靠。
9. 我不知道如何連接的設備,而在所有的任何一個USB連接,但如果你能,也許在您連接它可以通過發出切換adbd到TCP模式adb tcpip <port>

從終端,從任何PC上通過連接到您的設備通過WiFi:adb connect <ip>:<port>

也許也有可能從該裝置上的終端切換到TCP模式。
10. 我覺得其他的答案就簡單得多了adbWireless: 只需在手機上安裝一個應用程序切換調試通過wifi,安裝一個Eclipse插件,你就大功告成了。
11. 要連接您的TCP埠 請確保您的系統和設備連接到網路 1。打開控制台的cmd.exe 2,型號ADB TCPIP 5555 3。至系統->選項-> USB調試unchek它TCPIP連接 4.type ADB連接192.168.1.2這是您的設備ip地址 5。連接到192.168.1.2 如果你錯誤:未找到設備 連接設備到系統然後按照 為紮根設備 對應setProp service.adb.tcp.port 5555 停止adbd 啟動adbd
12. 在我的系統是這樣的: 我在我的Linux shell中的Android設備,一個簡單的「使用ifconfig」沒有我的IP地址。我只好類型: 用ifconfig eth0 -或- 加上netcfg 讓我的IP地址。 (我知道是eth0的配置,我看到它在我的dmesg)然後我做了: 對應setProp service.adb.tcp.port-1 停止adbd 啟動adbd 然後在我的Win7盒(一個運行Eclipse 3.7.1)。我打開提示 \\ Android的SDK \\平台工具> 沒有以管理員身份運行。然後我做了一個 ADB連接12.345.678.90 我從來沒有把一個埠。如果我做了 亞行TCPIP 5555 它說,它無法找到該設備,然後沒有出現在我的「亞行的設備」列表中。即這只是工作,如果我不這樣做上面。 我可以做一個「亞殼」與我的Android設備。但我的Android設備不現在出現在我的運行->運行配置-> Target選項卡。在另一方面,如果我把目標選項卡設置為自動。後來,當我通過運行我的應用程序運行->運行它並運行我的Android設備上,即使我的Android設備甚至沒有列為我的目標之一。
13. 要使用TCP和USB模式之間切換只需你可以將它添加到/init.rc:on property:service.adb.tcp.port=*
restart adbd
on property:service.adb.tcp.enable=1
setprop service.adb.tcp.port 5555
on property:service.adb.tcp.enable=0
setprop service.adb.tcp.port -1

現在你財產service.adb.tcp.enable啟用或禁用偵聽埠5555。運行netstat以檢查它是否在聽。正如你可以看到它也會觸發,如果你想改變service.adb.tcp.port手動。
14. 使用adbwireless應用程序,使手機,亞行從Windows機器連接到它對話。在手機上的應用程序adbwireless告訴你如何連接到它,給人的IP地址和一切。 要少得多有趣的選擇是通過USB進行連接,告訴亞行通過TCPIP 5555手機TCPIP,然後斷開USB,ADB連接。這是更難通過這種方式,你必須找出手機的IP地址,你自己(adbwireless告訴你的IP),你必須通過USB進行連接,你必須運行adb的TCPIP(adbwireless需要的是照顧過)。 所以:在手機上安裝adbwireless。使用它。這是可能的,我這樣做經常在Linux和Windows上。
15. 我放在一起自動啟用和通過TCP連接adb,通過USB連接的設備的批處理文件。有了它,你不必把在IP手動。@echo off
setlocal
REM Use a default env variable to find adb if possible
if NOT "%AndroidSDK%" == "" set PATH=%PATH%;%AndroidSDK%\platform-tools
REM If off is first parameter then we turn off the tcp connection.
if "%1%" == "off" goto off
REM Set vars
set port=%1
set int=%2
if "%port%" == "" set port=5557
if "%int%" == "" set int=wlan0
REM Enable TCP
adb -d wait-for-device tcpip %port%
REM Get IP Address from device
set shellCmd="ip addr show %int% | grep 'inet [0-9]{1,3}(\.[0-9]{1,3}){3}' -oE | grep '[0-9]{1,3}(\.[0-9]{1,3}){3}' -oE"
for /f %%i in ('adb wait-for-device shell %shellCmd%') do set IP=%%i
REM Connect ADB to device
adb connect %IP%:%port%
goto end
:fail
echo adbWifi [port] [interface]
echo adbWifi off
goto end
:off
adb wait-for-device usb

『柒』 android怎麼實現tcp數據傳輸

Socket s = new Socket("192.168.1.1",5200)//"ip",port
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
InputStream in = s.getInputStream();
byte[] b = new byte[in.available];
in.read(b);
String str = new String(b);
out.print("收到"+s);
out.flush();

『捌』 Android伺服器通信的幾種方式詳解

大 學學習網路基礎的時候老師講過,網路由下往上分為物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。通過初步的了解,我知道IP協議對應於網 絡層,TCP協議對應於傳輸層,而HTTP協議對應於應用層,三者從本質上來說沒有可比性,socket則是對TCP/IP協議的封裝和應用(程序員層面 上)。也可以說,TPC/IP協議是傳輸層協議,主要解決數據如何在網路中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。關於TCP/IP和 HTTP協議的關系,網路有一段比較容易理解的介紹: 「我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使 用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝 HTTP文本信息,然後使用TCP/IP做傳輸層協議將它發到網路上。」
而我們平時說的最多的socket是什麼呢,實際上socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API), 通過Socket,我們才能使用TCP/IP協議。實際上,Socket跟TCP/IP協議沒有必然的聯系。Socket編程介面在設計的時候,就希望也 能適應其他的網路協議。所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道 的一些最基本的函數介面,比如create、listen、connect、accept、send、read和write等等。網路有一段關於 socket和TCP/IP協議關系的說法比較容易理解:「TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外 的操作介面。這個就像操作系統會提供標準的編程介面,比如win32編程介面一樣,TCP/IP也要提供可供程序員做網路開發所用的介面,這就是 Socket編程介面。」
關於TCP/IP協議的相關只是,用博大精深來講我想也不為過,單單查一下網上關於此類只是的資料和書籍文獻的數量就知道,這個我打算會買一些經典的書籍 (比如《TCP/IP詳解:卷一、卷二、卷三》)進行學習,今天就先總結一些基於基於TCP/IP協議的應用和編程介面的知識,也就是剛才說了很多的 HTTP和Socket。
CSDN上有個比較形象的描述:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網路通信的能力。
實際上,傳輸層的TCP是基於網路層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的介面。
下面是一些經常在筆試或者面試中碰到的重要的概念,特在此做摘抄和總結。
一。什麼是TCP連接的三次握手
第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉 連接之前,TCP 連接都將被一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過「四次握手」(過程就不細寫了,就是伺服器和客 戶端交互,最終確定斷開)
二。利用Socket建立網路連接的步驟
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
1。伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
2。客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連接請求。
3。 連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶 端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
三。HTTP鏈接的特點
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
四。TCP和UDP的區別(考得最多。。快被考爛了我覺得- -\\)
1。 TCP是面向鏈接的,雖然說網路的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證 了)保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接 收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
2。也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。
知 道了TCP和UDP的區別,就不難理解為何採用TCP傳輸協議的MSN比採用UDP的QQ傳輸文件慢了,但並不能說QQ的通信是不安全的,因為程序員可以 手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然後由接收方進行驗證啊什麼的,即使是這樣,UDP因為在底層協議的封裝上沒有採用類似 TCP的「三次握手」而實現了TCP所無法達到的傳輸效率。

『玖』 android tcp通信接收數據就閃退的原因

內存不足導致的閃退。比如說androidtc內存沒有釋放,一長條列表下有N個資源需要展示,不斷下拉,上面的資源沒有釋放,所分配的內存越來越多,最後當然會閃退。

『拾』 android設備怎麼設置tcpip

1. 使用USB數據線連接設備(此方法需配置adb環境變數,也可直接進入adb工具目錄執行\android-sdk-windows\platform-tools\)。
2. 命令輸入adb tcpip 5555 ( 5555為埠號,可以自由指定)。
3. 斷開 USB數據,此時可以連接你需要連接的USB設備。
4. 再命令輸入 adb connect <設備的IP地址>:5555
後面就可以使用ADB ,DDMS 來調試Android應用或顯示Logcat 消息。
5. 如果需要恢復到USB數據線,可以在命令行輸入adb usb
註: Android設備的IP地址可以通過(設置->關於手機->狀態信息)查看

閱讀全文

與androidtcp伺服器相關的資料

熱點內容
三田壓縮機與電裝 瀏覽:708
重生細胞安卓版沒鍵盤怎麼玩 瀏覽:994
小米nfc手機刷加密卡 瀏覽:290
linux如何下載文件 瀏覽:808
linuxrpm依賴 瀏覽:370
匯率pdf 瀏覽:353
帶分數的演算法思維 瀏覽:115
如何讓伺服器支持asp文件 瀏覽:48
python網站自動簽到腳本 瀏覽:888
程序員和語言框架哪個重要 瀏覽:776
文件伺服器上面有什麼 瀏覽:383
需求不清是程序員面臨的真正挑戰 瀏覽:952
放療有關的演算法 瀏覽:750
java和python交互 瀏覽:647
貴州網路伺服器機櫃雲主機 瀏覽:267
未來番禺程序員待遇 瀏覽:213
安卓安智部落沖突密碼怎麼改 瀏覽:648
http協議單片機 瀏覽:75
pdfdocument 瀏覽:558
gcc編譯vi文件 瀏覽:65